为什么我无需在无限循环后提供返回值?

时间:2013-11-13 11:29:31

标签: java

回答:此主题的最佳答案基本上回答了我的问题: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编译器没有像上面给出的示例那样花费跟踪方法,因为它无法在常规设置中找到所有可能的循环。

5 个答案:

答案 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();