八叉树 StackOverflowError
Octree StackOverflowError
美好的一天,我正在实现八叉树。但是,当输入大小大于 2 时,我一直收到 WhosebugError。我不知道为什么会收到此错误。
八叉树的实例化
octree = new Octree(3, new Point(0,0,0));
其中第一个参数是维度,第二个参数是根
八叉树的人口代码:
public void generateList(int num)
{
for(int i = 0 ; i < num; i++)
for (int j = 0 ; j < num; j++)
for (int z = 0 ; z < num; z++)
if (!(z == j && j == i)) {
octree.add_nodes(i,j,z);
}
}
八叉树add_nodes的代码
public boolean add_nodes(double x, double y, double z) {
boolean success = false;
System.out.println(x+","+y+","+z);
if (this.i < 8) {
if (compare(x, y, z)) {
if (root.childPoints == null) {
System.out.println("Root is null" + x + " " + y + " " + z);
}
this.root.childPoints[i] = new Point(x, y, z);
this.i++;
success = true;
}
}
else if (this.childNodes == null) {
this.create_nodes_of_nodes(x, y, z);
for (int j = 0; j < 8; j++) {
double tempx = this.root.x - root.childPoints[j].x;
double tempy = this.root.y - root.childPoints[j].y;
double tempz = this.root.z - root.childPoints[j].z;
int checker = compareValues(tempx, tempy, tempz);
this.childNodes[checker].add_nodes(root.childPoints[j].x,
root.childPoints[j].y, root.childPoints[j].z);
}
root.childPoints = null;
double tempx = this.root.x - x;
double tempy = this.root.y - y;
double tempz = this.root.z - z;
int checker = compareValues(tempx, tempy, tempz);
this.childNodes[checker].add_nodes(x, y, z);
// this.i=0;
}
else {
if (childNodes != null) {
int checker = compareValues(x, y, z);
childNodes[checker].add_nodes(x, y, z);
}
}
return success;
}
错误:
Exception in thread "main" java.lang.WhosebugError
at sun.misc.FloatingDecimal$BinaryToASCIIBuffer.appendTo(FloatingDecimal.java:307)
at sun.misc.FloatingDecimal.appendTo(FloatingDecimal.java:89)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:709)
at java.lang.StringBuilder.append(StringBuilder.java:226)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:73)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:97)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:107)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:107)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:107)
and an additional 400 lines of at
edu.modesta.test.octree.Octree.add_nodes(Octree.java:107) error
希望有人能回答。谢谢!
我不是 100% 确定,因为我看不到代码的其余部分,但看起来您在 i >= 8
时输入了 add_nodes()
。从那时起,您的控制流程会显示
if (this.childNodes == null)
,做一些事情然后调用 add_nodes()
,
else if (childNodes != null)
,做一些事情然后调用 add_nodes()
。
无论哪种方式,如果 i
不小于 8,您将调用 add_nodes()
,并且由于您从不递减 i
,每个后续调用都将调用 add_nodes()
也是。
每次调用方法时,新方法的帧都会添加到堆栈中。当最终堆栈变得太大时,会发生 WhosebugException
。由于您假设调用 add_nodes()
无限次,因此每次调用都会稍微增加堆栈,直到它变得太大,因此出现异常。
顺便说一句:我有点不明白为什么你将 childNodes
称为 this.childNodes
而只是 childNodes
。 this
通常仅当您有两个具有不同范围但名称相同的变量时才需要,而您在此处没有。您可能还想复习一下 using this
。
美好的一天,我正在实现八叉树。但是,当输入大小大于 2 时,我一直收到 WhosebugError。我不知道为什么会收到此错误。
八叉树的实例化
octree = new Octree(3, new Point(0,0,0));
其中第一个参数是维度,第二个参数是根
八叉树的人口代码:
public void generateList(int num)
{
for(int i = 0 ; i < num; i++)
for (int j = 0 ; j < num; j++)
for (int z = 0 ; z < num; z++)
if (!(z == j && j == i)) {
octree.add_nodes(i,j,z);
}
}
八叉树add_nodes的代码
public boolean add_nodes(double x, double y, double z) {
boolean success = false;
System.out.println(x+","+y+","+z);
if (this.i < 8) {
if (compare(x, y, z)) {
if (root.childPoints == null) {
System.out.println("Root is null" + x + " " + y + " " + z);
}
this.root.childPoints[i] = new Point(x, y, z);
this.i++;
success = true;
}
}
else if (this.childNodes == null) {
this.create_nodes_of_nodes(x, y, z);
for (int j = 0; j < 8; j++) {
double tempx = this.root.x - root.childPoints[j].x;
double tempy = this.root.y - root.childPoints[j].y;
double tempz = this.root.z - root.childPoints[j].z;
int checker = compareValues(tempx, tempy, tempz);
this.childNodes[checker].add_nodes(root.childPoints[j].x,
root.childPoints[j].y, root.childPoints[j].z);
}
root.childPoints = null;
double tempx = this.root.x - x;
double tempy = this.root.y - y;
double tempz = this.root.z - z;
int checker = compareValues(tempx, tempy, tempz);
this.childNodes[checker].add_nodes(x, y, z);
// this.i=0;
}
else {
if (childNodes != null) {
int checker = compareValues(x, y, z);
childNodes[checker].add_nodes(x, y, z);
}
}
return success;
}
错误:
Exception in thread "main" java.lang.WhosebugError
at sun.misc.FloatingDecimal$BinaryToASCIIBuffer.appendTo(FloatingDecimal.java:307)
at sun.misc.FloatingDecimal.appendTo(FloatingDecimal.java:89)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:709)
at java.lang.StringBuilder.append(StringBuilder.java:226)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:73)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:97)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:107)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:107)
at edu.modesta.test.octree.Octree.add_nodes(Octree.java:107)
and an additional 400 lines of at
edu.modesta.test.octree.Octree.add_nodes(Octree.java:107) error
希望有人能回答。谢谢!
我不是 100% 确定,因为我看不到代码的其余部分,但看起来您在 i >= 8
时输入了 add_nodes()
。从那时起,您的控制流程会显示
if (this.childNodes == null)
,做一些事情然后调用 add_nodes()
,
else if (childNodes != null)
,做一些事情然后调用 add_nodes()
。
无论哪种方式,如果 i
不小于 8,您将调用 add_nodes()
,并且由于您从不递减 i
,每个后续调用都将调用 add_nodes()
也是。
每次调用方法时,新方法的帧都会添加到堆栈中。当最终堆栈变得太大时,会发生 WhosebugException
。由于您假设调用 add_nodes()
无限次,因此每次调用都会稍微增加堆栈,直到它变得太大,因此出现异常。
顺便说一句:我有点不明白为什么你将 childNodes
称为 this.childNodes
而只是 childNodes
。 this
通常仅当您有两个具有不同范围但名称相同的变量时才需要,而您在此处没有。您可能还想复习一下 using this
。