我正在尝试使用一组特定值构造一个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();”。我不知道发生了什么,考虑到我发现的一个例子使用了几乎相同的代码结构,并且编译时没有任何错误。任何帮助将不胜感激。
答案 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()
时才会调用它。构造函数中的代码不必创建对象(分配空间),只需初始化它(为其字段设置值)。