java - 令人困惑的 while block

标签 java while-loop scjp

以下代码块给我一个编译时错误。

        while(false)
        {
          System.out.println("HI");
        }

该错误表明存在无法访问的语句。 但以下代码可以编译

   boolean b=false;
   while(b)
   {
        System.out.println("Hi");
    }

我能想到的就是这个 -> In case-1 as false 是一个文字,所以编译器发现它无法访问,而 in case2 变量 b 在 while 条件 block 中在运行时被检查,所以没有编译错误?

最佳答案

编译器编写者无法决定将哪些条件标记为错误 - 规则位于 Java 语言规范中,对于此问题,请参见 14.21 Unreachable Statements .

相关句子是:“当且仅当 while 语句可达且条件表达式不是值为 false 的常量表达式时,所包含的语句可达。”

在每种情况下,您都有一个可达的 while 语句。在第一个版本中,false 是一个常量表达式,其值为 false,因此所包含的语句不被认为是可达的。在第二个版本中,b 根本不是常量表达式,因此所包含的语句被视为可访问。

final 添加到 b 的声明中会将 while 条件更改为值为 false 的常量表达式,从而使所包含的语句再次无法访问。

在 JLS 中指定什么是编译时错误、什么不是编译时错误的规则的好处是所有 Java 编译器都应该接受相同的程序集。规则一般不要求编译器做数据流分析,大概是为了限制编写编译器的成本和难度。

关于java - 令人困惑的 while block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18752999/

相关文章:

java - SCJP 断言语句

java - contextDestroyed() 与 addShutdownHook()

java - 将代码库从 SimpleMailMessage 更改为 MimeMessage 后单元测试中断

while-loop - Camel中有while循环吗?

python - 如何在我的代码工作时跳出 for 和 try 循环?

c++ - 我正在计算的序列(冰雹)在需要打印一次时打印两次

java - 为什么连接两个字符串并将其作为参数传递不会创建新的字符串对象?

java - 将表达式的结果分配给原语

java - Java 中的空格和换行符是否被视为字节?

javax.xml.bind.JAXBException Hibernate Java 10