小弟请教: 一个小程序输出问题:这是异常还是错误??
无意中发现这样一个程序:
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 死循环
------解决方案--------------------学习了
顶一个