请问java编译器优化可达异常俘获分支机构?

问题描述 投票:3回答:2

为什么代码

void methodThrowsException() /*throws  Exception*/{
    try {
      // throw new Exception();
    } catch (Exception e) {
      throw e;
    }
}

以及编译?因为它可以抛出一个异常或不AFAIK编译器不分析代码。这里明显throw e;不会运行(由于评论// throw new Exception();),但为什么编译器知道这一点?

java exception try-catch throw throws
2个回答
3
投票

javac编译器确实没有做太多优化。但是,简单的死代码检测和优化技术还没有可能的。

在您的例子:编译器可以很容易地检测到try块是空的。空try块不能扔,所以所有catch块的代码基本上是死的。

因此,编译器会去和简单的下降整个try / catch语句完全在这里。然后有可能抛出一个异常所剩无几。

其中,当我们使用javap的正是我们在寻找的字节码:

  void methodThrowsException();
    Code:
       0: return

是的,对方的回答是完全正确的:因为你使用Exception这只是以这种方式工作,更具体的(选中)子类会导致编译错误。


3
投票

编译器将检测未如抛出具体的检查异常

void methodThrowsException() {
    try {
    } catch (URISyntaxException e) {
        throw e;
    }
}

会导致编译器错误:

exception java.net.URISyntaxException is never thrown in body of corresponding try statement

但它不会检查运行时异常,或异常层次的根类型,如ExceptionErrorThrowable。这在JLS 11.2.3. Exception Checking解释。

© www.soinside.com 2019 - 2024. All rights reserved.