Java编译混乱:为什么这段代码编译?

Vai*_*hta 2 java javac

我不确定为什么这段代码(在运行时给出stackoverflow)编译:

import java.io.*;
import java.util.*;

public class StackOverflow {
   StackOverflow overflow = new StackOverflow();

   public void myCall() {
       overflow.myPrint();
   }

   public static void main(String[] args) {
       StackOverflow newStackOverflow = new StackOverflow();
       newStackOverflow.myCall();
   }

   public void myPrint() {
       System.out.println("I am confused!");
   }
}
Run Code Online (Sandbox Code Playgroud)

我之所以感到困惑的原因是因为在类定义中,我正在尝试创建我想要定义的类的对象.这不应该是编译时错误吗?

Mak*_*oto 5

这不是编译时错误,因为编译器无法判断它是否会在编译时无限生成.

你和我可以看一下并确实看到它,但编译器只关心声明是否正确.没有什么语法非法关于这个声明,这就是为什么编译器将随它去吧.

它与暂停问题有关,因为程序无法报告它是否会成功停止.