收到 StackOverflow 错误,为什么?

Getting StackOverflow error and why?

为什么我在第 11 行收到 WhosebugError。 我收到错误的行: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();
}

}

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

这一切一直持续到 Whosebug。

您正在 JavaInnerclass 中创建狗

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

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

并且当你创建一个新的 Dog 时,你创建了一个新的 JavaInnerClass

new JavaInnerClass().callInnerClassMethod(animalQuantity)

这是一个循环。

发生这种情况的原因是当构建 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,依此类推...直到系统用完堆栈 space。

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