【问题标题】:Compile error: unreported exception Add; must be caught or declared to be thrown编译错误:未报告的异常添加;必须被抓住或宣布被抛出
【发布时间】:2019-04-19 07:28:42
【问题描述】:

我想通过添加创建用户定义的异常,但出现编译错误。

class Test{

    public static void main(String[] args){

        int a=9, b=67, result;
        result = a+b;
        throw new Add("Addition has been performed");
    }
}
class Add extends Throwable{
    Add(){
        printStackTrace();
    }
    Add(String message){
        System.out.println(message);
        printStackTrace();  
    }
}

错误是:

Practice.java:8: error: unreported exception Add; must be caught or declared to be thrown
                throw new Add("Addition has been performed");

【问题讨论】:

  • 这两个类在同一个文件中?
  • 了解已检查和未检查的异常。
  • 是的,它们在同一个文件中。

标签: java exception throw


【解决方案1】:

我要指出,无论编译错误和可能的修复如何,扩展Throwable 都是一个坏主意。

  • 没有必要。您可以/应该扩展 ExceptionRuntimeException 或其任何子类。

  • 有很多代码假定所有异常都是ExceptionError 或其子类型,而不是Throwable 的某些“随机”子类型。

  • Throwable 的随机子类的一般含义尚不清楚;例如见Which subclass of Throwable should be caught and which shouldn't?

另请参阅此问答中的讨论:


异常的构造函数打印或记录错误消息和堆栈跟踪也是一个坏主意。应该由捕获异常的代码来决定如何处理它们。

【讨论】:

  • “有很多代码假设......”当然你知道他们所说的“假设”......
  • 是的。那个代码是错误的。但仍然......这是一个问题。
【解决方案2】:

要使您的异常不受检查,请按以下方式声明它

class Add extends RuntimeException {
} 

【讨论】:

    【解决方案3】:

    捕获/重新抛出 Add 可抛出对象 或从RuntimeException 扩展它——它们不是必须被捕获的。

    class Add extends RuntimeException
    

    【讨论】:

      【解决方案4】:

      如果你不想让你的异常不被选中,你需要声明你的方法可能会抛出这个异常

      public static void main(String[] args) throws Add {
      

      或者用 try/catch 语句包围它

      try {
          throw new Add("Addition has been performed");
      } catch (Add add) {
          add.printStackTrace();
      }
      

      总的来说,我建议您使用 IDE,他们非常擅长帮助您解决此类问题。

      【讨论】:

        【解决方案5】:

        您已成功创建并抛出异常,但使用 Try 和 捕获块来处理它。

        【讨论】:

          【解决方案6】:

          首先,Java 中有两种类型的异常。检查和未检查。检查的是抛出的异常,您必须通过捕获它们(围绕块、代码的一部分、包含会抛出类似您的异常的方法)或声明调用此方法的父方法抛出异常来处理。

          Throwable 是 Java 中所有错误的基类。错误有多种类型,一个子类型就是异常。

          同样重要的是,您似乎在成功时抛出异常,这不是最好的做法,因为异常在资源方面代价高昂。在这种情况下,最好使用事件来广播发生的添加。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多