0

I'm having problem with the boolean divide(int depth) method in the Triangle class I created, the code is as follows. Other parts have passed the test, but because of the boolean divide(int depth), this programming throws a java.lang.NullPointerException.

I've been working on it for a long time but I still don't know what's wrong with the recursion. Both boolean divide() and boolean divide(int depth) don't take any argument, this makes it so difficult for me to write the recursion. Any hint will be appreciated, thanks a lot.

boolean divide(int depth)overwrites boolean divide(), boolean divide()divides the triangle into three sub triangles, it creates three Vertex2D on each edge of a triangle and the sub-triangles are stored in the Triangle class in an array as an attribute.

public class Triangle {
    private static final int NUM_OF_SUB_TRIANGLES = 3;
    private final Vertex2D[] vertices = new Vertex2D[3];
    private final Triangle[] subTriangles = new 
Triangle[NUM_OF_SUB_TRIANGLES];
    public  Triangle(Vertex2D v1, Vertex2D v2, Vertex2D v3){
        vertices[0] = v1;
        vertices[1] = v2;
        vertices[2] = v3;
    }

// Method returns a vertex of the triangle according to input index
public Vertex2D getVertex(int index) {
    for (int i = 0; i < 3; i++) {
        if (index == i) {
            return vertices[i];
        }
    }
    return null;
}

public boolean isEquilateral(){
    double side1 = vertices[0].distance(vertices[1]);
    double side2 = vertices[0].distance(vertices[2]);
    double side3 = vertices[1].distance(vertices[2]);

    if(Math.abs(side1-side2) < 0.001 && Math.abs(side1-side3) < 0.001 && Math.abs(side2-side3) < 0.001){
        return true;
    }else{
        return false;
    }

}

// Method outputs the coordinates of threes vertices of the triangle
// edit this one
public String toString(){
    String s = "Triangle: vertices=" + vertices[0]
            + " [" + vertices[1].getX() + ", " + vertices[1].getY() + "] " + "[" + vertices[2].getX() + ", " + vertices[2].getY()
            + "]";
    return s;
}

// Method checks if the three sub triangles are created
public boolean isDivided(){
    for(int i = 0 ; i < NUM_OF_SUB_TRIANGLES; i ++){
        if(subTriangles[i] == null){
            return false;
        }
    }
    return true;
}

// Method returns a sub triangle according to the input index
public Triangle getSubTriangle(int index){
    for (int i = 0; i < 3; i++) {
        if (index == i) {
            return subTriangles[i];
        }
    }
    return null;
}

// Method divides the triangle into three sub triangles

public boolean divide(){
    if (isDivided()){
        return false;
    }else{
        // Find vertices of the three sub triangles
        Triangle t1 = new Triangle(vertices[0], vertices[0].createMiddle(vertices[1]), vertices[0].createMiddle(vertices[2]));
        Triangle t2 = new Triangle(vertices[0].createMiddle(vertices[1]), vertices[1], vertices[1].createMiddle(vertices[2]));
        Triangle t3 = new Triangle(vertices[0].createMiddle(vertices[2]), vertices[1].createMiddle(vertices[2]), vertices[2]);

        subTriangles[0] = t1;
        subTriangles[1] = t2;
        subTriangles[2] = t3;

        return true;
    }
}

public boolean divide(int depth){
    if(depth <= 0){
        return false;
    }else{
        while(depth > 0) {
            if (!isDivided()) {
                divide();
            } else {
                depth -= 1;
                for (int i = 0; i < 3; i++) {
                    getSubTriangle(i).divide(depth);
                }
                depth -= 1;
            }
        }
        return true;
    }

}
}
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
Xichu
  • 105
  • 5
  • See [What is a stack trace, and how can I use it to debug my application errors?](http://stackoverflow.com/q/3988788/418556) & [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/q/218384/418556) – Andrew Thompson Oct 12 '18 at 05:23

2 Answers2

0

The problem seems to be with this code

public Triangle getSubTriangle(int index){
    for (int i = 0; i < 3; i++) {
        if (index == i) {
            return subTriangles[i];
        }
    }
    return null;    // HERE
}

But why do you even loop in this method

if (index < 3) return subTriangles[index];
return null;

and then check your calling code that the retunred value is not null

Scary Wombat
  • 44,617
  • 6
  • 35
  • 64
0

The problem is on getSubTriangle(i).divide(depth). Change your code with:

public boolean divide(int depth){
    if(depth <= 0){
        return false;
    }else{
        while(depth > 0) {
            if (!isDivided()) {
                divide();
            } else {
                depth -= 1;
                for (int i = 0; i < 3; i++) {
                    Triangle t=getSubTriangle(i);
                    if (t!=null) {
                      t.divide(depth);
                    }
                }
                depth -= 1;
            }
        }
        return true;
    }

}

Just to test it:

public class Triangle {

    public static class Vertex2D {

        private float x;
        public Vertex2D(float i, float j) {
            x=i;
            y=j;
        }



        public float getX() {
            return x;
        }



        public void setX(float x) {
            this.x = x;
        }



        public float getY() {
            return y;
        }



        public void setY(float y) {
            this.y = y;
        }



        private float y;

        public double distance(Vertex2D vertex2d) {
            float x1=vertex2d.x-x;
            float y1=vertex2d.y-y;

            return Math.sqrt(x1*x1+y1*y1);
        }



        public Vertex2D createMiddle(Vertex2D vertex2d) {
            float x1=vertex2d.x+x;
            float y1=vertex2d.y+y;

            Vertex2D v=new Vertex2D(x1, y1);
            v.setX(x1);
            v.setY(y1);


            return v;
        }

    }

    private static final int NUM_OF_SUB_TRIANGLES = 3;
    private final Vertex2D[] vertices = new Vertex2D[3];
    private final Triangle[] subTriangles = new 
Triangle[NUM_OF_SUB_TRIANGLES];
    public  Triangle(Vertex2D v1, Vertex2D v2, Vertex2D v3){
        vertices[0] = v1;
        vertices[1] = v2;
        vertices[2] = v3;
    }

// Method returns a vertex of the triangle according to input index
public Vertex2D getVertex(int index) {
    for (int i = 0; i < 3; i++) {
        if (index == i) {
            return vertices[i];
        }
    }
    return null;
}

public boolean isEquilateral(){
    double side1 = vertices[0].distance(vertices[1]);
    double side2 = vertices[0].distance(vertices[2]);
    double side3 = vertices[1].distance(vertices[2]);

    if(Math.abs(side1-side2) < 0.001 && Math.abs(side1-side3) < 0.001 && Math.abs(side2-side3) < 0.001){
        return true;
    }else{
        return false;
    }

}

// Method outputs the coordinates of threes vertices of the triangle
// edit this one
public String toString(){
    String s = "Triangle: vertices=" + vertices[0]
            + " [" + vertices[1].getX() + ", " + vertices[1].getY() + "] " + "[" + vertices[2].getX() + ", " + vertices[2].getY()
            + "]";
    return s;
}

// Method checks if the three sub triangles are created
public boolean isDivided(){
    for(int i = 0 ; i < NUM_OF_SUB_TRIANGLES; i ++){
        if(subTriangles[i] == null){
            return false;
        }
    }
    return true;
}

// Method returns a sub triangle according to the input index
public Triangle getSubTriangle(int index){
    for (int i = 0; i < 3; i++) {
        if (index == i) {
            return subTriangles[i];
        }
    }
    return null;
}

public static void main(String args[]) {
    Vertex2D v1=new Vertex2D(10,20);
    Vertex2D v2=new Vertex2D(-10,-20);
    Vertex2D v3=new Vertex2D(10,-20);
    Triangle t=new Triangle(v1, v2, v3);

    boolean r = t.divide(3);
    System.out.println(r);

}

// Method divides the triangle into three sub triangles

public boolean divide(){
    if (isDivided()){
        return false;
    }else{
        // Find vertices of the three sub triangles
        Triangle t1 = new Triangle(vertices[0], vertices[0].createMiddle(vertices[1]), vertices[0].createMiddle(vertices[2]));
        Triangle t2 = new Triangle(vertices[0].createMiddle(vertices[1]), vertices[1], vertices[1].createMiddle(vertices[2]));
        Triangle t3 = new Triangle(vertices[0].createMiddle(vertices[2]), vertices[1].createMiddle(vertices[2]), vertices[2]);

        subTriangles[0] = t1;
        subTriangles[1] = t2;
        subTriangles[2] = t3;

        return true;
    }
}

public boolean divide(int depth){
    if(depth <= 0){
        return false;
    }else{
        while(depth > 0) {
            if (!isDivided()) {
                divide();
            } else {
                depth -= 1;
                for (int i = 0; i < 3; i++) {
                    Triangle t = getSubTriangle(i);
                    System.out.println(t.toString());
                            if (t!=null) {
                                t.divide(depth);
                            }
                }
                depth -= 1;
            }
        }
        return true;
    }

}
}

And the output is (I'm not check about the meaning of result of algorithm):

Triangle: vertices=Triangle$Vertex2D@15db9742 [0.0, 0.0] [20.0, 0.0]
Triangle: vertices=Triangle$Vertex2D@15db9742 [10.0, 20.0] [30.0, 20.0]
Triangle: vertices=Triangle$Vertex2D@15db9742 [20.0, 40.0] [40.0, 40.0]
Triangle: vertices=Triangle$Vertex2D@6d06d69c [10.0, 20.0] [40.0, 40.0]
Triangle: vertices=Triangle$Vertex2D@7852e922 [40.0, 40.0] [30.0, 20.0]
Triangle: vertices=Triangle$Vertex2D@4e25154f [0.0, 0.0] [20.0, 0.0]
Triangle: vertices=Triangle$Vertex2D@4e25154f [10.0, 20.0] [30.0, 20.0]
Triangle: vertices=Triangle$Vertex2D@70dea4e [0.0, 0.0] [20.0, 0.0]
Triangle: vertices=Triangle$Vertex2D@5c647e05 [20.0, 0.0] [20.0, 0.0]
Triangle: vertices=Triangle$Vertex2D@33909752 [20.0, 0.0] [20.0, 0.0]
Triangle: vertices=Triangle$Vertex2D@33909752 [50.0, 20.0] [50.0, 20.0]
Triangle: vertices=Triangle$Vertex2D@55f96302 [20.0, 0.0] [40.0, 0.0]
Triangle: vertices=Triangle$Vertex2D@3d4eac69 [40.0, 0.0] [20.0, 0.0]
Triangle: vertices=Triangle$Vertex2D@42a57993 [-10.0, -20.0] [0.0, -40.0]
Triangle: vertices=Triangle$Vertex2D@42a57993 [-10.0, -20.0] [0.0, -40.0]
Triangle: vertices=Triangle$Vertex2D@42a57993 [-10.0, -20.0] [0.0, -40.0]
Triangle: vertices=Triangle$Vertex2D@75b84c92 [-10.0, -20.0] [-10.0, -60.0]
Triangle: vertices=Triangle$Vertex2D@6bc7c054 [-10.0, -60.0] [0.0, -40.0]
Triangle: vertices=Triangle$Vertex2D@232204a1 [-10.0, -20.0] [-10.0, -60.0]
Triangle: vertices=Triangle$Vertex2D@232204a1 [-20.0, -40.0] [-20.0, -80.0]
Triangle: vertices=Triangle$Vertex2D@4aa298b7 [-10.0, -20.0] [-20.0, -80.0]
Triangle: vertices=Triangle$Vertex2D@7d4991ad [-20.0, -80.0] [-10.0, -60.0]
Triangle: vertices=Triangle$Vertex2D@28d93b30 [-10.0, -60.0] [0.0, -40.0]
Triangle: vertices=Triangle$Vertex2D@28d93b30 [-10.0, -100.0] [0.0, -80.0]
Triangle: vertices=Triangle$Vertex2D@1b6d3586 [-10.0, -60.0] [-10.0, -100.0]
Triangle: vertices=Triangle$Vertex2D@4554617c [-10.0, -100.0] [0.0, -40.0]
Triangle: vertices=Triangle$Vertex2D@74a14482 [0.0, -40.0] [10.0, -20.0]
Triangle: vertices=Triangle$Vertex2D@74a14482 [20.0, -40.0] [30.0, -20.0]
Triangle: vertices=Triangle$Vertex2D@74a14482 [40.0, -40.0] [50.0, -20.0]
Triangle: vertices=Triangle$Vertex2D@1540e19d [20.0, -40.0] [50.0, -60.0]
Triangle: vertices=Triangle$Vertex2D@677327b6 [50.0, -60.0] [30.0, -20.0]
Triangle: vertices=Triangle$Vertex2D@14ae5a5 [0.0, -40.0] [10.0, -60.0]
Triangle: vertices=Triangle$Vertex2D@14ae5a5 [20.0, -80.0] [30.0, -100.0]
Triangle: vertices=Triangle$Vertex2D@7f31245a [0.0, -40.0] [10.0, -100.0]
Triangle: vertices=Triangle$Vertex2D@6d6f6e28 [10.0, -100.0] [10.0, -60.0]
Triangle: vertices=Triangle$Vertex2D@135fbaa4 [10.0, -60.0] [10.0, -20.0]
Triangle: vertices=Triangle$Vertex2D@135fbaa4 [40.0, -80.0] [40.0, -40.0]
Triangle: vertices=Triangle$Vertex2D@45ee12a7 [10.0, -60.0] [20.0, -80.0]
Triangle: vertices=Triangle$Vertex2D@330bedb4 [20.0, -80.0] [10.0, -20.0]
Triangle: vertices=Triangle$Vertex2D@15db9742 [0.0, 0.0] [20.0, 0.0]
Triangle: vertices=Triangle$Vertex2D@42a57993 [-10.0, -20.0] [0.0, -40.0]
Triangle: vertices=Triangle$Vertex2D@74a14482 [0.0, -40.0] [10.0, -20.0]
true
xcesco
  • 4,690
  • 4
  • 34
  • 65