【问题标题】:Throw custom Exceptions in Java/Android在 Java/Android 中抛出自定义异常
【发布时间】:2015-04-25 22:22:39
【问题描述】:

我正在开发一个自定义 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;
    }
}

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

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

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

【问题讨论】:

  • 你在哪里接触到这个?

标签: java android exception exception-handling


【解决方案1】:

如果您的自定义异常从 Exception 类扩展,则必须对其进行处理(使用 try-catch)或传递给调用者(使用 throws)。如果你只是想把它留给运行时处理异常,你需要从RuntimeException类扩展它 由于它是您场景中的第一种情况,您应该执行以下操作:

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){
    }
}

【讨论】:

    【解决方案2】:

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

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

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

    这是模块化和抽象的整体 OOP 范式的一部分:谁负责处理 Exception,是方法的调用者还是方法本身?答案取决于Exception 的性质。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我这样做了,但它仍然要求我用 try catch 包围。
      • @Sonhja 查看我对第二部分的回答。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 非常感谢!!!!!!!扩展 RuntimeException 适用于扩展 Exception 无法编译的客户错误。我不知道如何抑制“未处理的异常”消息。切换异常类型就成功了!
        • 顺便说一句:“message”不需要重新引入,它已经是基础异常的一部分了。
        猜你喜欢
        • 1970-01-01
        • 2020-01-10
        • 2011-10-06
        • 2012-10-28
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多