Java跨类调用变量触发NullPointerException异常问题求解
问题根因
调用calcPayment()触发NullPointerException的直接原因是**InsurancePolicies抽象父类中声明的Car car成员变量从未被赋值,默认值为null**。你在main方法中独立创建的Car c实例和两个保单子类对象没有任何关联,当代码执行到car.price逻辑时,本质是在访问null对象的属性,必然抛出空指针。
附带其他代码逻辑问题:
Car类构造方法逻辑错误:传入的price参数没有赋值给成员变量,反而硬编码将this.price设为0,且参数类型为int,和成员变量的double类型不匹配- 方法调用顺序错误:你在执行
calcPayment()计算保费前就调用了printtp()、printcp(),此时premium为默认值0,打印结果无意义 - 创建两个保单实例时,子类构造方法仅初始化了自身的独有属性,没有给继承自父类的
car属性赋值
修复步骤
- 修正
Car类构造方法,匹配price参数类型,正确完成成员变量赋值 - 修改两个保单子类的构造方法,新增Car类型入参,将传入的Car实例赋值给父类继承来的
car成员 - 调整main方法中实例创建逻辑,创建保单时传入已经初始化的Car对象,调整方法调用顺序,先计算保费再执行打印
修复后完整代码
package Lab1; import java.util.Scanner; public class main{ public static void main(String[] args){ Car c = new Car("model",1998, 0); // 创建保单实例时关联同一个Car对象 ThirdPartyPolicy tp = new ThirdPartyPolicy("hello", c); ComprehensivePolicy comp = new ComprehensivePolicy(2,31, c); Scanner scan = new Scanner(System.in); System.out.println("Input price of car"); c.price= scan.nextDouble(); // 先计算保费再打印 tp.calcPayment(); comp.calcPayment(); tp.printtp(); comp.printcp(); scan.close(); } } class Car{ String model; int ManufacturingYear; double price; // 修正构造方法参数与赋值逻辑 public Car(String model, int ManufacturingYear, double price){ this.model=model; this.ManufacturingYear=ManufacturingYear; this.price=price; } enum CarType { SUV, SED, LUX, HATCH, ETC, } public double getprice(){ return price; } } abstract class InsurancePolicies{ String policyHolderName; int id; Car car; int numberofclaims = 1; double premium; int flatRate = 150; double calcPayment(){ this.premium = ((car.price/100)+(numberofclaims*200)+flatRate); return premium; } public void print(){ System.out.println(premium); } } class ThirdPartyPolicy extends InsurancePolicies{ String comments; // 新增Car入参,给父类car属性赋值 public ThirdPartyPolicy(String comments, Car car){ this.comments=comments; this.car = car; } @Override public double calcPayment(){ this.premium = ((car.price/100)+(numberofclaims*200)+flatRate); System.out.println("第三方责任险保费:" + premium); return premium; } public void printtp(){ super.print(); } } class ComprehensivePolicy extends InsurancePolicies{ int driverage; int level; // 新增Car入参,给父类car属性赋值 public ComprehensivePolicy(int level, int driverage, Car car){ this.level=level; this.driverage=driverage; this.car = car; } public Car getCar() { return car; } @Override double calcPayment(){ this.premium = ((car.price/100)+(numberofclaims*200)+flatRate); if (driverage<30){ this.premium += ((30-driverage)*50); } System.out.println("全险保费:" + premium); return premium; } public void printcp(){ super.print(); } }
效果说明
修复后两个保单实例的car属性都指向你创建的同一个Car对象,访问car.price时不会再获取到null值,空指针异常会完全消除。输入汽车价格后,程序会按照你预设的公式正确计算两类保险的保费并输出。
内容的提问来源于stack exchange,提问作者Boster Flaming
相关产品推荐
相关产品推荐

