获取stackoverflow错误以及原因



为什么我在第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();
}

}

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。

您正在用JavainnerClass创建狗

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

每次实例化新对象时,它们都是创建的。

当您创建新狗时,您会创建一个新的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,依此类推...直到系统用尽堆栈空间为止。

因此,您需要确保在调用递归方法时没有方法调用周期。似乎您在定义的内联班上遇到了一些问题,所以也许如果您告诉我们要做什么,我们也许可以帮助您更多。

最新更新