日期:2014-05-20  浏览次数:20881 次

小弟请教: 一个小程序输出问题:这是异常还是错误??
无意中发现这样一个程序:
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句时,程序都能正常编译运行,请问这是怎么回事,是异常还是什么错误?

------解决方案--------------------
这是因为创建一个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) 
 
------解决方案--------------------
这还不算错?
------解决方案--------------------
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




------解决方案--------------------
楼上说的不错,在程序中一定要避免无结束标志的循环啊
------解决方案--------------------
典型的static 死循环
------解决方案--------------------
学习了
顶一个