回答:此主题的最佳答案基本上回答了我的问题:Missing return statement in a non-void method compiles。
我想知道为什么我不需要在这个private
方法中返回一个值?
public class Test {
private String testLoop() {
while(true) { }
}
public static void main(String[] args) {
Test test = new Test();
test.testLoop();
}
}
我觉得这不应该编译。但是,它编译得很好。这被定义为合法的?
在这种情况下,我觉得将方法改为:
很奇怪private String testLoop() {
while(true) {
if(false == true) {
break;
}
}
return null;
}
要求我提供一个返回类型,即使 javap 告诉我编译器为testLoop
的两个实现生成完全相同的字节代码。
那么Java编译器如何以及何时确定方法是否实际需要返回值?
不幸的是,删除的答案提到了halting problem。我想Java编译器没有像上面给出的示例那样花费跟踪方法,因为它无法在常规设置中找到所有可能的循环。
答案 0 :(得分:4)
private String testLoop() {
while(true) { } //infinite loop
}
上面的方法永远不会返回,因为那里有无限循环。所以它不会期待回归或它永远不会回报。
答案 1 :(得分:1)
你的while循环while(true) { }
将永远不会结束,因此编译器不会期望返回语句。如果编译器发现循环将结束,那么它将期望返回语句。您可以使用{手动测试it.try {1}}这会产生编译错误,编译器会要求你重新发送一个语句
答案 2 :(得分:1)
方法
private String testLoop() {
while(true) { }
}
在编译过程中确实没有返回点,这意味着在编译时,从来没有一个时间它“寻找”一个返回..
当然这不是一个好习惯,空循环尤其是那些true
条件的循环应该在IDE中弹出错误。
答案 3 :(得分:0)
while(true){}不允许执行您编写的任何其他语句
private String testLoop() {
while(true) { }
//any code at this point is not reachable since it wont come out of while loop. So return statement just like any java code wont be reachable.
}
答案 4 :(得分:-4)
你调用testloop方法,并且不需要返回值....如果你这样写,那么私有方法必须返回一些东西。
String result = test.testloop();