为什么Java编译器不能为无法访问的语句产生无法访问的语句错误?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (30)

如果我尝试编译

for(;;)
{

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

Java编译器产生一个错误说Unreachable statement。但是,如果我添加另一个“ 无法访问 ”(根据我)break声明,并使其成为:

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

它编译。为什么它不会产生错误?就是Java想说 两个错误作出正确的?

提问于
用户回答回答于

行为在不可达语句的JLS描述中定义:

如果if-then语句可到达,那么then语句是可访问的。

因此编译器确定then-statement(break;)是可访问的,无论其中的条件如何if

还有一点,我的重点是:

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

  • for语句是可访问的,有一个条件表达式,条件表达式不是一个值为true的常量表达式(第15.28节)。
  • 有一条可访问的break语句退出for语句。

所以for可以正常完成,因为then语句包含一个break。正如你注意到的,如果你换break了它,它将不起作用return

理由在本节末尾解释。在实质上,if有一个特殊的处理允许构造如:

if(DEBUG) { ... }

DEBUG可能是一个编译时间常量。

用户回答回答于

具体结构if(compile-time-false)作为明确的后门免除不可达规则。在这种情况下,编译器会将您break视为可访问的。

扫码关注云+社区