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

Throw custom Exceptions in Java/Android

我正在开发一个自定义异常 class,其中我有以下构造函数:

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;
    }
}

然后我像这样创建一个新的自定义异常:

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

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

所以,我做错了什么?我误会了什么?

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

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

如果您的自定义异常扩展自 Exception class, it must be handled (using try-catch) or passed on to caller (using throws). If you just want to leave it to runtime to handle the exception, You need to extend it from RuntimeException Class 由于它是您场景中的第一种情况,您应该这样做:

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

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

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

public void callingMethod () {
    try {
        surroundingMethod();
    } catch (UserException ex){
    }
}

除了 Eran 的回答之外,您还可以让您的自定义异常扩展 RuntimeException,这不需要被捕获。

您应该将您的方法声明为 throws UserException - 或者使您的异常扩展 RuntimeException.

官方不建议使用后者,但通常用于绕过 java's declared exception mechanism

在Java中,当您throw一个检查 Exception时,您还需要做一件事:

1.throw 周围添加一个 try-catch 块并在同一方法中处理此 Exception

2. 或者在方法定义中添加一条throws语句,将Exception的处理责任转移给更高层方法。

这是模块化和抽象的整体 OOP 范例的一部分:谁负责处理 Exception、方法的调用者或方法本身?答案取决于 Exception.

的性质