java - 而(真);当不在 void 中时,循环会抛出无法访问的代码

标签 java c++ compiler-construction while-loop

我正在用 java 做一些小程序。我知道如果我写 while(true); 程序将卡住在这个循环中。如果代码是这样的:

测试 1:

public class While {
    public static void main(String[] args) {
        System.out.println("start");
        while (true);
        System.out.println("end");
    }
}

编译器向我抛出错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Unreachable code
    at While.main(While.java:6)

我不知道存在这个错误。但我知道为什么它会被抛出。当然,第 6 行无法访问,导致编译问题。然后我测试了这个:

测试 2:

public class While {
    public static void main(String[] args) {
        System.out.println("start");
        a();
        b();
    }
    static void a() {
        while(true);
    }
    static void b() {
        System.out.println("end");
    }
}

由于某种原因程序正常运行(控制台打印“开始”然后卡住)。编译器无法检查 void a() 内部并发现它无法访问。可以肯定的是我试过了:

测试 3:

public class While {
    public static void main(String[] args) {
        System.out.println("start");
        a();
        System.out.println("end");
    }
    static void a() {
        while(true);
    }
}

结果与测试 2 相同。

经过一番研究,我发现了这个 question 因此,如果括号内的代码是变量,编译器不会抛出异常。这是有道理的,但我不认为这同样适用于 voids

问: 那么,如果 void b()(测试 2),为什么编译器只是在测试 1 中向我抛出错误并且 System.out.println("end");(测试 3)无法访问?

编辑:我在 C++ 中尝试了测试 1:

#include <iostream>

using namespace std;

int main()
{
    cout << "start" << endl;
    while(true);
    cout << "end" << endl;
    return 0;
}

编译器没有抛出任何错误,然后我得到了与测试 2 和测试 3 相同的结果。所以我想这是 java 的东西?

最佳答案

language spec has an exact definition编译器应该将什么视为不可访问的代码,另见 https://stackoverflow.com/a/20922409/14955 .

特别是,它不关心一个方法是否完成,也不查看其他方法的内部。

它不会做更多的事情。

但是,您可以使用 FindBugs 之类的静态代码分析工具来进行“更深入”的分析(但不确定它们是否检测到您描述的模式,并且正如其他人所指出的那样,在无论如何,所有一般性都无法通过算法解决,因此必须在“尽力而为”的某个合理定义上划清界限)。

关于java - 而(真);当不在 void 中时,循环会抛出无法访问的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24130399/

相关文章:

c++ - 从它的迭代器推导出参数类型

c++ - 将结构与模式集匹配

c++ - 矩阵乘法 : Strassen vs. 标准

compiler-construction - 决定一个不正确的程序是否可以有一个正确的延续

c++ - 用于简单数组创建和 i/o 的 C vs C++ 代码优化

compiler-construction - 从什么地方调用Compiler-RT?

java - 如何在 Eclipse 中以编程方式打开编辑器上的文件?

java - 具有空条目值的 Collectors.toMap 中的 NullPointerException

java - 读取巨大的文本文件Java

java - 类构造函数中大量参数的优雅替代方案