说我在Java类中有以下行,
System.out.println("start");
if(true)//The compiler will give compile time error if I uncomment this.
throw new RuntimeException();
System.out.println("end");
如果if(true)
被评论,则会出现无法访问的代码错误消息。为什么编译器不知道if(true)
下的行总是会被执行?
Java编译器的设计是这样工作还是限制?
答案 0 :(得分:6)
这是围绕代码可达性的有意设计的一部分。请参阅JLS的section 14.21,其底部有关于此的部分。
这种不同处理的基本原理是允许程序员定义“标志变量”,例如:
static final boolean DEBUG = false;
然后编写如下代码:
if (DEBUG) { x=3; }
我们的想法是,应该可以将DEBUG的值从false更改为true或从true更改为false,然后正确编译代码而不对程序文本进行其他更改。
答案 1 :(得分:1)
这是一个限制,你要检查你有多远的代码或代码永远不会运行。
JVM可以检测到代码已经死了而不能编译它。