java编译器优化无法访问的异​​常捕获分支吗?

为什么是代码

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

好编译?
AFAIK编译器不分析代码是否会抛出异常.
这里明显扔e;将永远不会运行(由于评论//抛出新的Exception();),但为什么编译器知道这一点?

最佳答案
javac编译器实际上没有做太多的优化.但是简单的死代码检测和优化仍然是可能的.

在您的示例中:编译器可以轻松检测到try块为空.空的try块不能抛出,所以所有catch块代码基本上都是死的.

所以编译器可以进入并简单地完全删除整个try / catch.然后没有任何东西可以抛出异常.

当我们使用javap时,我们在字节码中找到了正确的内容:

  void methodThrowsException();
    Code:
       0: return

是的,另一个答案是完全正确的:这只能以这种方式工作,因为您正在使用Exception,更具体(已检查)的子类将导致编译器错误.

转载注明原文:java编译器优化无法访问的异​​常捕获分支吗? - 代码日志