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=规格;