我该如何理解这个Java编译器的行为?
while (true) return;
System.out.println("I love Java");
// Err: unreachable statement
if (true) return;
System.out.println("I hate Java");
// OK.
谢谢。
编辑:
我在几分钟后找出了重点:
在第一种情况下,编译器由于无限循环而抛出错误。在两种情况下,编译器都不考虑语句结果内部的代码。
编辑 II:
现在让我印象深刻的是 javac:
if (true) return; // Correct
}
while (true) return; // Correct
}
看起来javac知道循环和if语句的内部内容,但是当您编写另一个命令(如第一个示例中)时,您会得到不同的行为(看起来javac忘记了循环/ if语句的内部内容)。
第三次编辑:根据这个答案的结果,我可以说一下(希望是正确的):对于Java,表达式if(arg){...;return;}
和while(arg){...;return;}
在语义上和语法上(字节码)等效,当且仅当argv
是非常量(或有效的最终类型)表达式。 如果argv
是常量表达式,字节码(和行为)可能有所不同。
免责声明:本问题不涉及无法访问的语句,而是涉及逻辑等效表达式的不同处理,例如while true return
和if true return
。