Ошибка переполнения стека при создании нового объекта в Java - PullRequest
3 голосов
/ 25 июля 2011

Я пытаюсь создать объект 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 ]

10 голосов
/ 25 июля 2011

Каждое создание нового объекта приводит к созданию другого нового объекта (и т. Д.) До тех пор, пока стек не будет переполнен.

Вместо этого это должно выглядеть так:

public PackingCase(){ 
    this.setCase(1, 2, 3, 4);
    vol = this.volume();
    System.out.println(""+vol);
}
3 голосов
/ 25 июля 2011

У вас есть рекурсивный вызов в конструкторе. Оставьте конструктор пустым (просто удалите его) и запустите этот код из 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);
}
1 голос
/ 25 июля 2011
public PackingCase(){      PackingCase PC1 = new PackingCase(); ...}

Конструктор рекурсивно вызывает себя, вызывая переполнение стека.

0 голосов
/ 25 июля 2011

Вы вызываете new в обработчике для new, создавая бесконечный цикл (и так как стек конечен, в конечном итоге ему не хватает места)Но public PackingCase() { ... } является конструктором .Это означает, что он вызывается только тогда, когда кто-то уже использовал new PackingCase().Код внутри конструктора не должен создавать объект (выделять пространство), просто инициализировать его (установить значения для его полей).

...