gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:31:03 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com