在CATCH块中抛出的异常-它会再次被捕获吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

这似乎是一个编程101问题,我本来以为我知道答案,但现在发现自己需要再检查一遍。在下面这段代码中,第一个CATCH块中抛出的异常会被下面的常规异常CATCH块捕获吗?

try {
  // Do something
} catch(IOException e) {
  throw new ApplicationException("Problem connecting to server");
} catch(Exception e) {
  // Will the ApplicationException be caught here?
}

我一直以为答案是否定的,但现在我有了一些奇怪的行为,这可能会导致这种情况。对于大多数语言,答案可能是相同的,但我正在使用Java。

提问于
用户回答回答于
用户回答回答于

没有。很容易查到。

public class Catch {
    public static void main(String[] args) {
        try {
            throw new java.io.IOException();
        } catch (java.io.IOException exc) {
            System.err.println("In catch IOException: "+exc.getClass());
            throw new RuntimeException();
        } catch (Exception exc) {
            System.err.println("In catch Exception: "+exc.getClass());
        } finally {
            System.err.println("In finally");
        }
    }
}

应打印:

In catch IOException: class java.io.IOException
In finally
Exception in thread "main" java.lang.RuntimeException
        at Catch.main(Catch.java:8)

从技术上讲,这可能是编译器的错误、实现依赖的、未指定的行为或其他什么。但是,JLS非常好,编译器对于这种简单的事情来说已经足够好了。

还请注意,如果在两个CATCH块之间交换,它将不会编译。第二次捕获将是完全无法到达的。

注意,即使执行了CATCH块,最后块也总是运行(例如无限循环、通过工具接口附加、杀死线程、重写字节码等等)。

扫码关注云+社区