有谁知道为什么: public void foo() { System.out.println("Hello"); return; System.out.println("World!"); } 会在Eclipse下报告为“无法访问的错误”,但是 public void foo() { System.out.println("Hello"); if(true) return; System.out.println("World!"); } 只会触发“死代码”警告? 我能想到的惟一解释是Java编译器只标记第一个,而Eclipse中的一些额外分析则是第二个。 但是,如果是这样的话,为什么编译时Java编译器不能解决这个问题呢? Java编译器不会在编译时发现if(true)没有效果,从而产生本质上相同的字节码? 在什么时候应用可达代码分析? 我想一个更一般的方式来思考这个问题是:“什么时候可用的代码分析应用”? 在将第二个Java代码片段转换为最终字节码的过程中,我相信在某些时候,“if(true)”运行时等价物将被删除,并且两个程序的表示forms相同。 那么Java编译器会不会再次应用其可达的代码分析?