在Java/Android中抛出自定义异常

Son*_*hja 14 java android exception-handling exception

我正在开发一个自定义的Exception类,其中我有以下构造函数:

public class UserException extends Exception
{
    string message;
    public UserException() {
        super();
    }

    public UserException(String message, Throwable cause)
    {
        super(message, cause);

        this.cause = cause;
        this.message = message;
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个新的自定义异常,如下所示:

private Camera.PreviewCallback SetPreviewCallBack() throws UserException {
    .......
    // Something went wrong
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
 }
Run Code Online (Sandbox Code Playgroud)

但是,当我插入throw new UserException(...)它时,它告诉我用它包围try/catch!! 这不是主意,不是吗?当我需要抛出自定义异常时,我想抛出自定义异常,而不会new Exceptions使用更多的try/catch子句.

那么,我做错了什么?我误解了什么?

小智 19

除了Eran的答案,您还可以进行自定义Exception扩展RuntimeException,不需要捕获.


Era*_*ran 10

如果抛出此异常的方法不处理它(即它没有捕获它),它必须在throws子句中声明它,因为这是一个经过检查的异常.

public void yourMethod () throws UserException
{
    ...
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
    ...
}
Run Code Online (Sandbox Code Playgroud)


Ank*_*kit 6

如果您的自定义异常从Exception类扩展,则必须将其处理(使用try-catch)或传递给调用者(使用throws).如果你只想将它留给运行时来处理异常,你需要从RuntimeException类扩展它因为它是你的场景中的第一种情况,你应该这样做:

public void surroundingMethod() throws UserException{
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
}
Run Code Online (Sandbox Code Playgroud)

这实际上会将您的异常传递给调用者,所以现在调用者有责任使用try-catch处理它或者再次传递它.

所以,你需要修改调用指令

public void callingMethod () {
    try {
        surroundingMethod();
    } catch (UserException ex){
    }
}
Run Code Online (Sandbox Code Playgroud)