class For1
{
public static void main(String args[])
{
int a = 0;
for(;;)
{
break;
System.out.println(a); //Line 1
++a;//Line 2
}
}
}
我知道第1行/第2行永远不会被执行。 但我仍然不明白为什么抛出编译时错误。 我收到“无法访问的声明”编译错误。
这是否意味着编译器检查它是否能够为所有分支/代码行编译?
答案 0 :(得分:12)
这是否意味着编译器检查它是否能够为所有分支/代码行编译?
这意味着编译器检查每个语句是否可访问。
如果由于无法访问语句而无法执行该语句,则为编译时错误。
本节致力于对“可达”一词的精确解释。我们的想法是,从构造函数,方法,实例初始化程序或包含语句本身的静态初始化程序开始,必须有一些可能的执行路径。分析考虑了陈述的结构。
然后该部分记录了如何定义可达性。
特别是,您案例中的相关要点是:
如果S之前的语句可以正常完成,则非空交换块中的每个其他语句S都是可到达的。
break
,continue
,return
或throw
声明无法正常完成。
所以你的“第1行”语句前面有一个语句(break;
),无法正常完成,因此无法访问。
答案 1 :(得分:6)
编译器也能够得出这个结论,并假设你犯了一个错误。是的,Java编译器做了相当多的“数据流分析”。最常见的相关消息是关于未初始化的变量的消息。第二个最常见的是,我相信,恰恰是这个,关于代码无法访问。
答案 2 :(得分:3)
这是否意味着编译器会检查它是否能够编译 所有分支/代码行?
是编译器编译整个代码并根据您的代码生成字节代码,它更智能地检测unreachable code
dead code
。 break
中的立即for-loop
使其他语句无法访问。
for(;;){
break;
... // unreachable statement
}
int i=1;
if(i==1)
...
else
... // dead code
答案 3 :(得分:2)
无法访问的代码毫无意义且冗余。如果您的程序中有一些无法访问的代码,那么这是一个错误,需要修复。因此编译器会抛出错误。
您可以参考下面的类似问题
Unreachable code: error or warning? 和 Why does Java have an "unreachable statement" compiler error?
答案 4 :(得分:1)
编译器能够确定永远不会执行这两个语句,并通过拒绝编译来帮助您编写正确的代码,因为这有99.9%的可能性是错误而不是有意识地选择添加语句永远不会被执行。
答案 5 :(得分:0)
编译器将检查某些关键字后是否有更多代码。如果您将break
替换为return
,则会产生类似消息的另一个关键字。