无意中发现这样一个程序:
class Outer{
  public static class Inner{
    int i = 10;
    Inner in = new Inner();
  }
  public static void main(String[] args){
    System.out.println(new Inner().i);
  }
}问题:程序能编译但是运行时输出一堆这样的结果:
             ……
at Outer$Inner.<init>(Outer.java:4)
at Outer$Inner.<init>(Outer.java:4)
at Outer$Inner.<init>(Outer.java:4)
at Outer$Inner.<init>(Outer.java:4)
          …………
          …………当注掉程序的第4句或者第7句时,程序都能正常编译运行,请问这是怎么回事,是异常还是什么错误?

解决方案 »

  1.   

    这是因为创建一个Inner对象是个无限创建Inner对象的死循环
    因此堆栈溢出
    产生堆栈溢出异常
    Exception in thread "main" java.lang.StackOverflowError   
    at Outer$Inner. <init >(Outer.java:4) 
    at Outer$Inner. <init >(Outer.java:4) 
    at Outer$Inner. <init >(Outer.java:4) 
    at Outer$Inner. <init >(Outer.java:4) 
     
      

  2.   

    还是不明白,程序为什么会产生个无限创建Inner对象的死循环?虚拟机为什么没报告任何信息呢?
      

  3.   

    public static class Inner{ 
        int i = 10; 
        Inner in = new Inner(); 
      } 当你new 一个Inner对象时,Inner in = new Inner();被执行,这样new Inner();时Inner in = new Inner();又被执行,于是就一直无限循环下去了。
    java运行期本身可以判断这样的死循环的,但是static是静态加载,所以在程序运行前类加载过程中就死循环了,也就是运行期以前就死循环了,所以java不能判断。把static去掉估计可以避免这样的死循环问题。
    static的一些说明,可以参看
    http://topic.csdn.net/u/20071016/10/6ad641df-e153-4cbf-b4d3-e60b1a693340.html
    http://topic.csdn.net/u/20071003/10/40521843-0ad7-4393-b6ca-4637ef6dbebb.html
      

  4.   

      典型的static 死循环