我在用Java做一些小程序。我知道,如果我编写 while(true);
程序,程序将在此循环中冻结。如果代码是这样的:
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行无法访问 ,从而导致编译问题。然后,我对此进行了测试:
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()
并无法访问。确保我尝试过:
public class While {
public static void main(String[] args) {
System.out.println("start");
a();
System.out.println("end");
}
static void a() {
while(true);
}
}
与测试2相同的结果。
经过一番研究,我发现了这个 。 因此,如果括号内的代码是变量,则编译器不会抛出异常 。这是有道理的,但我认为不适用于 voids
。
问: 那么,如果无法到达 void b()
(测试2)和 System.out.println("end");
(测试3),为什么编译器会在测试1处抛出错误?
编辑: 我尝试在C ++中的测试1:
#include <iostream>
using namespace std;
int main()
{
cout << "start" << endl;
while(true);
cout << "end" << endl;
return 0;
}
编译器没有抛出任何错误 ,然后我得到了与Test 2和Test 3相同的结果。所以我想这是Java吗?
该语言规范有一个确切的定义是什么,编译器应该当作可达代码,也见:
编译器的行为在Java语言规范的14.21节中有明确规定。无法到达的陈述。
这是一个关键语录,它直接解决了您的问题:
本节专门对“可达”一词进行精确的解释。这个想法是,从包含该语句的构造函数,方法,实例初始值设定项或静态初始值设定项的开始,必须有一些可能的执行路径。该分析考虑了语句的结构。除了对while,do和条件表达式的常数值为true的语句的特殊处理外,流分析中不考虑表达式的值。
特别是,它并不关心某个方法是否完成,也不会在其他方法内部查找。
它不会做得更多。
但是,您可以使用诸如FindBugs之类的静态代码分析工具来进行“更深入的”分析(尽管不确定它们是否能够检测到您描述的模式,而且正如其他人所指出的那样,总的来说,停止问题并不能解决)无论如何都可以通过算法解决,因此必须以“尽力而为”的某种合理定义来划清界线。
我正在努力解决FreeCodeCamp的一个挑战。但我正在尝试以更实用的方式编写代码。因此,挑战是求所有小于或等于给定数字的奇数斐波那契数的和。我试图避免for循环,并尝试使用本主题中公认的答案:如何在不进行尾部调用优化的情况下,用函数式编程替代while循环? 但我不明白为什么这不起作用。我错过了什么?我对这一点很陌生,如果答案太简单,我很抱歉。
我在用java编写一些小程序。我知道如果我写
问题内容: 我一生无法理解为什么我无法在while循环之外阅读postPrioity。我尝试过“ export postPrioity =“ 500””仍然无法正常工作。 有任何想法吗? -或在计划文字中- 输出:(我在files.txt中只有3个文件名) 问题答案: 管道操作员创建一个子外壳,请参阅BashPitfalls和BashFAQ。解决方案:不要使用,反正毫无用处。
迭代器无效是如何处理的,而不是循环? 例如,这段代码不起作用,因为迭代器在插入后无效: 但是,如果我用这个for循环替换while循环,它会正确编译和运行: 为什么for循环有效而while循环无效?
这是我的代码: 我的问题是如何检查分数是否在范围内,如果输入了错误的输入,如何使循环重复。当我试图运行程序并输入一个超过范围的输入时,它会转到下一个评估数字,而不是再次尝试,直到它是真的。
当我编译代码的时候 它显示编译时错误无法到达的代码。 但是当我把代码修改成 很好用。 谁能告诉我这种行为背后的原因吗。