【问题标题】:How to fix "Cannot invoke "java.awt.Point.getX()" because "this.p" is null"如何修复“无法调用”java.awt.Point.getX()”,因为“this.p”为空”
【发布时间】:2021-03-05 03:09:37
【问题描述】:

对于继承实践作业,我有一个扩展矩形的类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)

当我清楚地实例化五个 Point 对象时,我很困惑为什么它认为 this.p 为空。有什么想法吗?

【问题讨论】:

  • 你有没有试过单独为任何一个方块调用toString()方法,看看它在循环之前是否仍然抛出这个错误?
  • 你在你的Square.p隐藏 Rectangle.p

标签: java inheritance nullpointerexception point


【解决方案1】:

NullPointerException 是因为你没有在Square 类中初始化p。 Yu 刚刚将它传递给 Rectangle 构造函数,所以它是 Rectangle 类中的 p 正在初始化。

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

假设Rectangle 类具有p 的getter 方法,您可以将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();
    }
}

【讨论】:

    猜你喜欢
    • 2022-10-21
    • 1970-01-01
    • 2022-01-10
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    相关资源
    最近更新 更多