Java 重写另一个方法的方法将抛出NullPointerException,即使构造函数已经初始化

Java 重写另一个方法的方法将抛出NullPointerException,即使构造函数已经初始化,java,Java,我试图从父类重写toString方法,但每当我尝试运行该程序时,它都会抛出NullPointerException,即使我的构造函数已经初始化。扩展Vehicle的Car类就是问题所在。Ehen I删除程序运行时的spec.getNoOfDoors 以下是我的课程: 车辆: public abstract class Vehicle { private String serialNo; private Double price; private Integer size;

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

以下是我的课程:

车辆:

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..
    }
}
汽车:

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..
    }
}
像这样试试

    public class Car extends Vehicle{
//Below 'spec' is local for Car and not have the reference Vehicle class 'spec'
    CarSpec spec;

    public Car(CarSpec spec, String serialNo, double price, int size) {
        super(serialNo, price, size, spec);
        //Local 'spec' assigned by the spec received from constructor and the same in Vehicle 
        this.spec = spec;
    }

    @Override
    public String toString() {
        return String.format(super.toString() + "Door: %d", spec.getNoOfDoors()); //<- this is where the problem is..
    }
公共级轿车扩展车辆{
//以下“规格”是本地车辆,没有参考车辆等级“规格”
CarSpec规范;
公共汽车(汽车规格,字符串序列号,双倍价格,整数大小){
超级(序列号、价格、尺寸、规格);
//从建造商处收到的规范指定的本地“规范”和车辆中的“规范”
this.spec=spec;
}
@凌驾
公共字符串toString(){
返回String.format(super.toString()+“门:%d”,spec.getNoOfDoors());//这样试试

    public class Car extends Vehicle{
//Below 'spec' is local for Car and not have the reference Vehicle class 'spec'
    CarSpec spec;

    public Car(CarSpec spec, String serialNo, double price, int size) {
        super(serialNo, price, size, spec);
        //Local 'spec' assigned by the spec received from constructor and the same in Vehicle 
        this.spec = spec;
    }

    @Override
    public String toString() {
        return String.format(super.toString() + "Door: %d", spec.getNoOfDoors()); //<- this is where the problem is..
    }
公共级轿车扩展车辆{
//以下“规格”是本地车辆,没有参考车辆等级“规格”
CarSpec规范;
公共汽车(汽车规格,字符串序列号,双倍价格,整数大小){
超级(序列号、价格、尺寸、规格);
//从建造商处收到的规范指定的本地“规范”和车辆中的“规范”
this.spec=spec;
}
@凌驾
公共字符串toString(){

return String.format(super.toString()+“Door:%d”,spec.getNoOfDoors());//我认为错误的想法是

CarSpec spec;
以某种方式意味着与

在超类(
Vehicle
)中声明和初始化。但是,这是

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

因此,您需要在子类的构造函数中初始化这个
spec
,如

this.spec = spec;

请注意,这种行为是隐藏而不是重写的。变量与方法不同,是在编译时解析的,而不是在运行时解析的。

我认为错误的想法是

CarSpec spec;
以某种方式意味着与

在超类(
Vehicle
)中声明和初始化。但是,这是

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

因此,您需要在子类的构造函数中初始化这个
spec
,如

this.spec = spec;

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

这可能是一个大的代码转储,您至少应该告诉我们哪一行有问题。删除其他代码后,问题在Car类中,即使我已经在构造函数中初始化了noOfDoors,它仍然抛出空指针异常。如果我错了,请纠正我,但是您是否确实在car类中设置了CarSpec spec;变量?也许您应该在car构造函数中这样做:
this.spec=spec;
这可能是一个大的代码转储,您至少应该告诉我们哪一行有问题。删除了其他代码,问题出在Car类中,即使我已经在构造函数中初始化了noOfDoors,它仍然抛出空指针异常。如果我错了,请纠正我,但是您是否确实在Car类中设置了CarSpec spec;变量?也许您应该在Car构造函数中执行此操作:
this.spec=规格;