作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为什么是代码
void methodThrowsException() /*throws Exception*/{
try {
// throw new Exception();
} catch (Exception e) {
throw e;
}
}
编得好吗?AFAIK 编译器不会分析代码是否会抛出异常。这里很明显 throw e;
永远不会运行(由于注释 //throw new Exception();
),但为什么编译器知道这一点?
最佳答案
javac 编译器确实没有做很多优化。但是简单死代码检测和优化仍然是可能的。
在您的示例中:编译器可以轻松检测到 try block 为空。空的 try block 不能抛出,所以所有 catch block 代码本质上都是死的。
因此编译器可以进入并简单地将整个 try/catch 全部放到这里。然后就没有什么可以抛出异常了。
其中,当我们使用 javap 时,正是我们在字节码中发现的:
void methodThrowsException();
Code:
0: return
是的,另一个答案是完全正确的:这只能以这种方式工作,因为您正在使用 Exception
,更具体(已检查)的子类将导致编译器错误。
关于java - java编译器是否优化了无法访问的异常捕获分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573353/
我是一名优秀的程序员,十分优秀!