我正在用 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/