首页 > 解决方案 > 如何修复“无法调用”java.awt.Point.getX()”,因为“this.p”为空”

问题描述

对于继承实践作业,我有一个Square扩展矩形的类,以下是相关方法:

public class Square extends Rectangle {
    private Point p;
    private int sideLength;
    public Square(Point p, int sideLength){
        super(p);
        this.sideLength = sideLength;
    }

    public String toString(){
        return getClass().getName() + "\nCenter point: (" + p.getX() + ',' + p.getY() + ") \nSide Length: " + sideLength + " \nArea: " + this.getArea() + " \nPerimeter: " + this.getPerimeter();
    }


}

还有一个 getArea() 和 getPerimeter() 方法,但它们都不会导致这个问题。我有一个单独的课程来测试这个:

public class SquareTest {
    public static void main(String[] args){
        ArrayList<Square> squareList = new ArrayList<>();
        Point p1 = new Point(1, 1);
        Point p2 = new Point(1, 2);
        Point p3 = new Point(4, 1);
        Point p4 = new Point(2, 3);
        Point p5 = new Point(5, 4);
        Square one = new Square(p1, 1);
        Square two = new Square(p2, 2);
        Square three = new Square(p3, 4);
        Square four = new Square(p4, 4);
        Square five = new Square(p5,5);
        squareList.add(one);
        squareList.add(two);
        squareList.add(three);
        squareList.add(four);
        squareList.add(five);
        for (Square each : squareList){
            System.out.println(each.toString());
            System.out.println();
        }
    }
}

它应该做的是为五个正方形对象中的每一个打印出 toString() 结果,其中一个正方形看起来像这样:

Square
Center point: (1,1)
Side Length: 1
Area: 1
Perimeter: 1

但相反,我收到以下运行时错误:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.awt.Point.getX()" because "this.p" is null
    at Square.toString(Square.java:21)
    at SquareTest.main(SquareTest.java:23)

this.p当我清楚地实例化五个 Point 对象时,我对为什么它认为是 null 感到困惑。有任何想法吗?

标签: javainheritancenullpointerexceptionpoint

解决方案


NullPointerException是因为你还没有初始化pinSquare类。Yu 刚刚将它传递给Rectangle构造函数,因此它是正在初始化的pinRectangle类。

由于您没有使用点对象,Square而不仅仅是将其传递给超类,因此无需Point在类中声明对象Square。如果你的Rectangle类有一个 getter 方法Point p,你可以在Square类中使用它。

假设Rectangle该类有一个 getter 方法p,您可以将您的Square类重构为:

public class Square extends Rectangle {
    private int sideLength;
    public Square(Point p, int sideLength){
        super(p);
        this.sideLength = sideLength;
    }

    public String toString(){
        return getClass().getName() 
               + "\nCenter point: (" + getP().getX() + ',' + getP().getY()
               + ") \nSide Length: " + sideLength
               + " \nArea: " + this.getArea()
               + " \nPerimeter: " + this.getPerimeter();
    }
}

推荐阅读