java - 如何修复“无法调用”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 感到困惑。有任何想法吗?
解决方案
NullPointerException
是因为你还没有初始化p
inSquare
类。Yu 刚刚将它传递给Rectangle
构造函数,因此它是正在初始化的p
inRectangle
类。
由于您没有使用点对象,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();
}
}
推荐阅读
- mysql - MySQL - 为分组生成序列号
- html - 为什么元描述标签未在 Google 上显示
- microcontroller - LPC18S37引脚配置
- android - 附近显示可用连接列表
- spring - 为什么 Heroku App 没有访问我的 Spring-Boot 控制器端点?一切似乎都是正确的
- javascript - 向数组中的对象添加新值后更新 useContext
- kubernetes - Kubernetes 上 Druid 的 PVC
- php - 发送电子邮件时调用未定义的方法 GuzzleHttp\Utils::chooseHandler()
- php - php woocommerce rest api的curl语法错误
- swift - 在单个应用程序中编写多个 AR 体验