无法访问的声明:如果为true则为true

mar*_*094 9 java javac unreachable-code

我该如何理解这个Java编译器的行为?

while (true) return;
System.out.println("I love Java");
// Err: unreachable statement

if (true) return;
System.out.println("I hate Java");
// OK.
Run Code Online (Sandbox Code Playgroud)

谢谢.

编辑:

几分钟后我发现了这一点:

在第一种情况下,编译器因无限循环而抛出错误.在这两种情况下,编译器都不会考虑语句内部的代码.

编辑二:

让我对javac印象深刻的是:

    if (true) return; // Correct
}
    while (true) return; // Correct
}
Run Code Online (Sandbox Code Playgroud)

看起来javac知道两个循环内部是什么,如果结果,但是当你编写另一个命令时(如第一个例子中),你得到非等效行为(看起来像javac忘记了循环内部/ if).

公共静态最终EDIT III: 作为此答案我可以此话(希望正确)的结果:作为表达if (arg) { ...; return;}while (arg) { ...; return;}对Java是等效的两个语义和语法(在字节码)当且仅当argv是不恒定的(或有效最终型)的表达.如果argv是常量表达式字节码(和行为)可能不同.

免责声明 这个问题不是关于无法访问的语句,而是对逻辑等效表达式的不同处理,例如while true returnif true return.

k5_*_*k5_ 14

在java中可以访问语句时有非常严格的规则.这些规则的设计易于评估,而不是100%精确.它应该防止基本的编程错误.为了推断java中的可达性,您只能使用这些规则,"通用逻辑"不适用.

所以这里是Java语言规范14.21中的规则.无法访问的语句

如果if-then语句可以访问,则它可以正常完成.

因此,如果没有else,if-then之后的语句总是可以访问的

如果至少满足下列条件之一,则while语句可以正常完成:

  • while语句是可访问的,条件表达式不是值为true的常量表达式(第15.28节).

  • 有一个可到达的break语句退出while语句.

条件是一个常量表达式"true",没有中断.因此它没有正常完成.

  • 我记得看到这个的理由.基本的想法是你可以有`if(COMPILATION_SWITCH)返回; A`并且无论开关的值如何都能正确编译程序. (2认同)

squ*_*oid 5

根据文件:

除了对while,do和for条件表达式具有常量值true的语句的特殊处理外,在流分析中不考虑表达式的值.