在Java中构造新对象时出现Stack Overflow错误

时间:2011-07-25 04:45:06

标签: java object stack-overflow

我正在尝试使用一组特定值构造一个PackingCase对象。虽然程序在编码期间没有显示错误,但在运行时,我收到此错误;

Exception in thread "main" java.lang.StackOverflowError
at assignment.pkg2.PackingCase.<init>(PackingCase.java:59)
at assignment.pkg2.PackingCase.<init>(PackingCase.java:60)

我的代码如下;

public class PackingCase {
// private fields go here

int serialNumber;
int timesUsed;
int timeCreated;
int timeStored;
String name;
String description;


void setCase(int s, int TU, int TC, int TS){
    serialNumber = s;
    timesUsed = TU;
    timeCreated = TC;
    timeStored = TS;

}

double volume(){
    return serialNumber*timesUsed*timeCreated*timeStored;
}

public PackingCase(){ 
    PackingCase PC1 = new PackingCase();
    double vol;

    PC1.setCase(1, 2, 3, 4);

    vol = PC1.volume();
    System.out.println(""+vol);




}

第59行是“public PackingCase(){”,第60行是“PackingCase PC1 = new PackingCase();”。我不知道发生了什么,考虑到我发现的一个例子使用了几乎相同的代码结构,并且编译时没有任何错误。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:10)

每个新对象的创建都会导致创建另一个新对象(依此类推......),直到堆栈溢出为止。

相反,它看起来应该是这样的:

public PackingCase(){ 
    this.setCase(1, 2, 3, 4);
    vol = this.volume();
    System.out.println(""+vol);
}

答案 1 :(得分:3)

你在构造函数中有一个递归调用。保持构造函数为空(只需将其删除)并从main方法运行此代码:

public static void main(String[] a){
    PackingCase pc1 = new PackingCase();
    pc1.setCase(1, 2, 3, 4);
    double vol = pc1.volume();
    System.out.println(""+vol);
}

答案 2 :(得分:1)

public PackingCase(){      PackingCase PC1 = new PackingCase(); ...}

构造函数递归调用自身,导致stackoverflow。

答案 3 :(得分:0)

你在new的处理程序中调用new,创建一个无限循环(并且由于堆栈是有限的,它最终会耗尽空间)。但public PackingCase() { ... }构造函数。这意味着只有在有人使用new PackingCase()时才会调用它。构造函数中的代码不必创建对象(分配空间),只需初始化它(为其字段设置值)。