程序抛出堆栈溢出错误

时间:2015-05-31 17:24:17

标签: java exception stack-overflow

以下程序正确编译。是什么导致堆栈溢出错误?如何将异常推送到堆栈?

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");
        }
    }
}

3 个答案:

答案 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;