【问题标题】:unreported exception Exception; must be caught or declared to be thrown? [duplicate]未报告的异常异常;必须被抓住或宣布被扔掉? [复制]
【发布时间】:2015-05-21 18:16:56
【问题描述】:

下面的程序会报错

未报告的异常异常;必须被抓住或宣布被抛出

为什么重投不起作用?在 C# 中,无需将调用包装在 try 块中。

public class HelloWorld{

    public static double test() throws Exception {
        return 1;
    }

    public static void main(String []args){
        try {
            double a = test();
            System.out.println(a);
        }
        catch (Exception e) {
            throw e;
        }
    }
}

【问题讨论】:

  • 因为你不是从一个说throws它的方法中扔掉它。

标签: java


【解决方案1】:

C# 没有检查异常,因此不会出现此编译错误。

在 Java 中,如果你想从一个方法中抛出一个检查异常,你必须将该异常添加到 throws 子句中,在这里你可以将 main 方法更改为:

public static void main(String[] args) throws Exception

当main方法抛出异常时,JVM会将stacktrace写入stderr。

一般来说,将异常包装在未经检查的异常 (RuntimeException) 中也是可能的。在这种特殊情况下,由于这是从 main 方法抛出的,并且已检查异常的传播不是问题,因此包装异常所完成的只是生成更大的堆栈跟踪。

【讨论】:

  • "...您必须将该异常添加到 throws 子句中" 捕获并抛出一个 RuntimeException 以阻止恶意检查异常的传播。跨度>
  • @MadConan:这也行,传播检查的异常绝对是坏事..
  • main 之外传播 any 异常是不好的。为什么要创建运行时异常?处理异常的正确方法是处理
  • @RealSkeptic 我不同意。在很多情况下你什么都做不了——即使在main 中也是如此。到那时,您剩下的就是扔掉它。 JVM 本身会处理这个问题。并非每个应用都需要在控制台之外进行日志记录。
  • @RealSkeptic:对于从命令行运行的小程序,这可能不会太糟糕,具体取决于。无论如何,问题似乎是关于为什么 OP 的代码不能从 main 方法抛出异常。
【解决方案2】:

您需要尝试throw new RuntimeException(e) 而不是throw e。 Throwing Exception 将产生编译时错误,因为它需要您处理已检查的异常。 new RuntimeException(e) 基本上会包装你检查的异常并抛出它,中止程序。

【讨论】:

    【解决方案3】:

    如果main() 抛出一个异常并且没有捕获它,那么main() 必须有一个throws 声明。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多