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 return和if true return.
k5_*_*k5_ 14
在java中可以访问语句时有非常严格的规则.这些规则的设计易于评估,而不是100%精确.它应该防止基本的编程错误.为了推断java中的可达性,您只能使用这些规则,"通用逻辑"不适用.
所以这里是Java语言规范14.21中的规则.无法访问的语句
如果if-then语句可以访问,则它可以正常完成.
因此,如果没有else,if-then之后的语句总是可以访问的
如果至少满足下列条件之一,则while语句可以正常完成:
while语句是可访问的,条件表达式不是值为true的常量表达式(第15.28节).
有一个可到达的break语句退出while语句.
条件是一个常量表达式"true",没有中断.因此它没有正常完成.
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |