实例初始化器代码编译疑问:if与while(true)块的差异
实例初始化器的编译差异解析
先看两段实例初始化器代码的区别:
可正常编译的代码
{ if (true) { try { throw new IOException(); } catch (IOException e) { throw new RuntimeException(e); } } }
这段代码在if(true)块内抛出受检异常并捕获,随后抛出RuntimeException,能正常通过编译。
无法编译的代码
{ while (true) { try { throw new IOException(); } catch (IOException e) { throw new RuntimeException(e); } } }
编译时会报错:Initializer must be able to complete normally(初始化器必须能正常完成)
差异原因
Java编译器对实例初始化器有强制要求:初始化器必须存在正常完成的路径。
- 对于
if(true)的情况:尽管if块内一定会抛出异常,但编译器认为if块执行结束后,初始化器还有后续的空执行路径(哪怕什么都不做),满足“可正常完成”的判定条件。 - 对于
while(true)的情况:这是一个无限循环,编译器能明确判定这个循环永远不会正常退出,初始化器没有任何正常完成的可能,因此触发编译错误。
内容的提问来源于stack exchange,提问作者Mammad Yahyayev
相关产品推荐
相关产品推荐

