gpt4 book ai didi

java - 即使构造函数已经初始化,重写另一个方法的方法也会抛出 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 21:14:22 25 4
gpt4 key购买 nike

我试图从父类重写一个 toString 方法,但每当我尝试运行该程序时,它都会抛出一个 NullPointerException 即使我的构造函数已经初始化。扩展 VehicleCar 类就是问题所在。当我删除程序运行的 spec.getNoOfDoors 时。

这是我的类(class):

车辆:

public abstract class Vehicle {
private String serialNo;
private Double price;
private Integer size;
VehicleSpec spec;

public Vehicle(String serialNo, double price, int size, VehicleSpec spec) {
this.serialNo = serialNo;
this.price = price;
this.size = size;
this.spec = spec;
}

... // getters and setters

@Override
public String toString() {
return String.format("%s - %s, Color: %s - Serial No.: %s - Price: %s - Size: %s - ", spec.getBrand(), spec.getModel(), spec.getColor(), this.serialNo, this.price, this.size);
}
}

汽车:

public class Car extends Vehicle{
CarSpec spec;

public Car(CarSpec spec, String serialNo, double price, int size) {
super(serialNo, price, size, spec);
}

@Override
public String toString() {
return String.format(super.toString() + "Door: %d", spec.getNoOfDoors()); //<- this is where the problem is..
}
}

这是错误:

Exception in thread "main" java.lang.NullPointerException
at com.inventory.main.Car.toString(Car.java:12)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at com.inventory.main.CarInventorySearch.main(CarInventorySearch.java:16)

最佳答案

我认为误解是

CarSpec spec;

在某种程度上意味着与

相同(或覆盖)
VehicleSpec spec;

它是在父类(super class)(Vehicle)中声明和初始化的。然而,这是not the case

这是两个不同属性,您只能在子类中访问CarSpec类型的spec。此 spec 不会被初始化,只是因为您已在父类(super class)中初始化了 VehicleSpec spec

所以你需要在子类的构造函数中初始化这个spec,例如

this.spec = spec;

请注意,此行为是隐藏,而不是覆盖。与方法不同,变量是在编译时解析的,而不是在运行时解析的。

关于java - 即使构造函数已经初始化,重写另一个方法的方法也会抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40561307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com