以下程序正确编译。是什么导致堆栈溢出错误?如何将异常推送到堆栈?
public class Reluctant {
private Reluctant internalInstance = new Reluctant();
public Reluctant() throws Exception {
throw new Exception("I’m not coming out");
}
public static void main(String[] args) {
try {
Reluctant b = new Reluctant();
System.out.println("Surprise!");
} catch (Exception ex) {
System.out.println("I told you so");
}
}
}
答案 0 :(得分:4)
main
方法中的这一行导致无限递归:
Reluctant b = new Reluctant();
每当你尝试创建Reluctant
的实例时,你要做的第一件事是创建另一个实例,它创建另一个实例,创建另一个实例,...你明白了。
Voila,堆栈溢出!
答案 1 :(得分:3)
您有一个字段初始化代码,它由javac编译器自动添加到构造函数体中。实际上,您的构造函数如下所示:
private Reluctant internalInstance;
public Reluctant() throws Exception {
internalInstance = new Reluctant();
throw new Exception("I’m not coming out");
}
所以它以递归方式调用自己。
答案 2 :(得分:2)
你有一个无限循环。 Reluctant
类的每个实例都在Reluctant
声明上实例化另一个internalInstance
对象。因此,当您在Reluctant
方法上实例化第一个main
对象时,程序会一遍又一遍地创建一个实例,直到堆栈溢出。
替换此行.-
private Reluctant internalInstance = new Reluctant();
代表
private Reluctant internalInstance;