Java中出现NullPointerException异常求助:Square继承Shape实例化报错
看起来你在实例化Square对象时遇到了空指针异常,从报错栈来看,问题出在Shape父类的构造函数第19行,而这个构造函数是被Square的构造函数第18行调用的。我来帮你拆解一下可能的原因和修复方法:
核心原因分析
NullPointerException 本质上是你在代码中尝试调用一个null对象的方法或访问它的属性。结合你的报错栈,大概率是以下两种情况之一:
- Square构造函数在调用父类
super()方法时,传递了某个null参数给Shape的构造函数; - Shape构造函数的第19行代码,在处理某个成员变量时,该变量还未被初始化(或者被赋值为
null)就被使用了。
具体排查方向
检查Square构造函数的
super调用:
你在main方法里已经正确创建了Point p1 = new Point(3,3),但如果Square的构造函数第18行没有把这个p1正确传递给父类的构造函数,比如写成了super(null, 3)而不是super(p1, 3),那Shape构造函数拿到的Point就是null,后续调用它的方法(比如getX()、getY())就会触发空指针。举个错误写法的例子:
public Square(Point p, int side) { super(null); // 这里错误地传递了null this.side = side; }检查Shape构造函数第19行的代码:
找到Shape类第19行的代码,看看是不是在操作某个可能为null的变量。比如如果Shape的构造函数里有这样的代码:public Shape(Point center) { // 第19行:直接调用center的方法,但center可能为null this.centerX = center.getX(); this.centerY = center.getY(); }那如果Square传递过来的center是
null,这行就会报错。
修复建议
确保Square正确传递参数给父类:
修改Square的构造函数,把收到的Point参数完整传递给Shape的构造函数,比如:public Square(Point p, int side) { super(p); // 这里传递用户传入的非null Point this.side = side; // 其他Square的初始化逻辑 }在Shape构造函数中添加null校验(可选但推荐):
为了避免后续再出现类似问题,可以在Shape的构造函数里先检查参数是否为null,提前抛出明确的异常:public Shape(Point center) { if (center == null) { throw new IllegalArgumentException("Center point cannot be null"); } // 第19行的原有逻辑,比如赋值或调用方法 this.center = center; this.centerX = center.getX(); }
如果能提供Shape和Square构造函数的完整代码,我可以帮你更精准地定位问题,但按照目前的报错信息,上面的排查方向应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Pape Sow Traore

