2017-08-09 9 views
1

良い日、私はOctreeを実装しています。しかし、入力サイズが2より大きい場合、StackOverflowErrorを受け取っていました。なぜこのエラーが出るのかはわかりません。オクツリーOctree StackOverflowError

最初のパラメータは寸法及び第二のパラメータはオクツリー

のadd_nodesためのオクツリー

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); 
       } 
} 

コードの集団のルート

コードである

octree = new Octree(3, new Point(0,0,0)); 

スタン

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.StackOverflowError 
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) 

とホープ誰かが答えることができる

edu.modesta.test.octree.Octree.add_nodes(Octree.java:107)エラーでの追加の400行。ありがとう!

答えて

1

私はコードの残りの部分を見ることができないので100%確信していませんが、add_nodes()と入力したときのように見えます。i >= 8。その時から、あなたの制御フローが

if (this.childNodes == null)を言い、add_nodes()

else if (childNodes != null)を呼び出し、その後いくつかのものを行い、add_nodes()を呼び出し、その後、いくつかのものを行います。 iが8以上であれば、あなたはiをデクリメントしませんので、

いずれかの方法で、あなたはadd_nodes()を呼んでいることは、後続の各呼び出しは、あまりにもadd_nodes()を呼び出すために起こっています。

メソッドを呼び出すたびに、新しいメソッドのフレームがスタックに追加されます。最終的にスタックが大きくなりすぎると、StackOverflowExceptionが発生します。仮にadd_nodes()を無限回呼び出すと、各呼び出しはスタックが大きくなりすぎてExceptionになるまで少しずつ増加します。

脇の下として:childNodesthis.childNodesといい、ちょうどchildNodesと言っているのはちょっと混乱しています。 thisは、スコープの異なる2つの変数があり、同じ名前の変数がある場合にのみ必要です(ここには含まれていません)。 using thisでも同様にブラッシュアップしたいかもしれません。

関連する問題