无意中发现这样一个程序:
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句时,程序都能正常编译运行,请问这是怎么回事,是异常还是什么错误?
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句时,程序都能正常编译运行,请问这是怎么回事,是异常还是什么错误?
因此堆栈溢出
产生堆栈溢出异常
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)
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