编译器可以轻松而明确地证明第一个表达式 始终会 导致无限循环,但第二个表达式则不那么容易。在您的玩具示例中,这很简单,但是如果:
- 变量的内容是从文件中读取的?
- 该变量不是局部变量,可以被另一个线程修改?
- 该变量依赖于某些用户输入吗?
编译器显然不会检查您的简单情况,因为它完全放弃了这条路。为什么?因为它 更难
被禁止规范。参见第14.21节:
- http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21-300-M
(顺便说一下,我的编译器 确实 在声明变量时抱怨
final。)



