得到StackOverflow错误,为什么?

时间:2017-06-26 20:42:42

标签: java stack-overflow

为什么我在第11行得到StackOverflowError。 我收到错误的行:System.out.println(new JavaInnerClass().callInnerClassMethod(animalQuantity));

以下是完整代码:

public class Dog extends Animal {
private String animalName;
private int animalQuantity;

public Dog(String animalName, int animalQuantity) {
    animalName(animalName);
    quantity(animalQuantity);
    // JavaInnerClass.tempDog name = new JavaInnerClass.tempDog();
    // System.out.println(name.totalQuantity(animalQuantity));
    System.out.println(new JavaInnerClass().callInnerClassMethod(animalQuantity));
}

@Override
public String animalName(String animalName) {
    this.animalName = animalName;
    return animalName;
}

@Override
public int quantity(int animalQuantity) {
    this.animalQuantity = animalQuantity;
    return animalQuantity;
}

}

JavaInnerClass:

public class JavaInnerClass {

Dog[] dog = { new Dog("Husky", 90), new Dog("Boxer", 100) };

tempDog temp = new tempDog();

public static class tempDog {

    public int totalQuantity(int quantity) {
        return quantity + 200; // assuming a statement
    }

}

public int callInnerClassMethod(int quantity) {
    return temp.totalQuantity(quantity);
}

public static void main(String[] args) {
    new JavaInnerClass();
}

}

3 个答案:

答案 0 :(得分:1)

JavaInnerClass构造函数调用Dog构造函数,该构造函数调用调用JavaInnerClass构造函数的Dog构造函数......等等......

查看JavaInnerClass构造函数。

初始化数组字段dog

Dog[] dog = { new Dog("Husky", 90), new Dog("Boxer", 100) };

但是Dog构造函数是什么? 它创建了JavaInnerClass

的实例
public Dog(String animalName, int animalQuantity) {
     ...
    System.out.println(new JavaInnerClass().callInnerClassMethod(animalQuantity));
}

所有这一切都持续到stackoverflow。

答案 1 :(得分:0)

您正在JavaInnerclass中创建狗

Dog[] dog = { new Dog("Husky", 90), new Dog("Boxer", 100) };

每次实例化新对象时都会创建它们。

当您创建一个新的Dog时,您将创建一个新的JavaInnerClass

new JavaInnerClass().callInnerClassMethod(animalQuantity)

这是一个循环。

答案 2 :(得分:0)

发生这种情况的原因是,当构建Dog时,您提到的行会创建一个新的JavaInnerClass对象:

public Dog(String animalName, int animalQuantity) {
    animalName(animalName);
    quantity(animalQuantity);
    // JavaInnerClass.tempDog name = new JavaInnerClass.tempDog();
    // System.out.println(name.totalQuantity(animalQuantity));
    System.out.println(new JavaInnerClass().callInnerClassMethod(animalQuantity));
}

但是,然后JavaInnerClass构造函数创建了一个新的Dog

public class JavaInnerClass {
// this program is written to understand inner class..
Dog[] dog = { new Dog("Husky", 90), new Dog("Sheppered", 100) };
...
}

反过来,它会创建一个新的JavaInnerClass,依此类推......直到系统用完堆栈空间。

因此,在调用递归方法时,您需要确保没有方法调用循环。对于内联定义的类,似乎也有一些问题,所以如果你告诉我们你正在尝试做什么,我们或许可以帮助你多做一些。