You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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属性赋值
修复步骤
  1. 修正Car类构造方法,匹配price参数类型,正确完成成员变量赋值
  2. 修改两个保单子类的构造方法,新增Car类型入参,将传入的Car实例赋值给父类继承来的car成员
  3. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:45:47