为什么 Java 编译器不会为无法访问的 then 语句生成无法访问的语句错误?

如果我尝试编译

for(;;)
{

}
System.out.println("End");

Java 编译器生成一个错误,指出 .但是,如果我添加另一个“无法访问”(根据我的说法)语句并使其成为:Unreachable statementbreak

for(;;)
{
    if(false) break;
}
System.out.println("End");

它编译。为什么它不会产生错误?


答案 1

该行为在无法访问语句的 JLS 描述中定义:

如果 if-then 语句可访问,则 then 语句是可访问的。

因此,编译器确定 then 语句 () 是可访问的,而不管 .break;if

再进一步,强调我的:

基本语句可以正常完成,但至少满足以下一项为真:for

  • for 语句是可访问的,存在一个条件表达式,并且条件表达式不是值为 true 的常量表达式 (§15.28)。
  • 有一个可访问的中断语句退出 for 语句。

因此 for 可以正常完成,因为 then 语句包含 .如您所见,如果替换为 .,它将不起作用。breakbreakreturn


基本原理将在本节末尾解释。实质上,具有特殊处理,以允许以下结构:if

if(DEBUG) { ... }

其中 DEBUG 可能是编译时常量。


答案 2

正如我在回答类似问题时所解释的那样,特定构造作为显式后门不受无法访问规则的约束。在这种情况下,编译器会因此将您视为可访问的。if(compile-time-false)break


推荐