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

Raf*_*ter 8 java

:这个主题的最佳答案基本上回答了我的问题:在非void方法中缺少return语句编译.


我想知道为什么我不需要在这个private方法中返回一个值?

public class Test {
  private String testLoop() {
    while(true) { }
  }
  public static void main(String[] args) {
    Test test = new Test();
    test.testLoop();
  }
}
Run Code Online (Sandbox Code Playgroud)

我觉得这不应该编译.但是,它编译得很好.这被定义为合法的?

在这种情况下,我发现将方法更改为:

private String testLoop() {
  while(true) { 
    if(false == true) { 
      break;
    }
  }
  return null;
}
Run Code Online (Sandbox Code Playgroud)

要求我提供一个返回类型,即使javap告诉我编译器为两个实现生成完全相同的字节代码testLoop.

那么Java编译器如何以及何时确定方法是否实际需要返回值?


不幸的是,删除的答案提到了暂停问题.我想Java编译器并没有像上面给出的例子那样努力跟踪方法,因为它无法在常规设置中找到所有可能的循环.

Ruc*_*era 4

private String testLoop() {
    while(true) { }  //infinite loop
}
Run Code Online (Sandbox Code Playgroud)

上面的方法永远不会返回,因为那里存在无限循环。所以它不期待回报或者永远不会达到回报。