从另一个类调用变量时,空指针异常



我正在编写一个程序通过输入一个价格然后使用该价格和设置的值在两个子类之间进行计算这两个子类继承自父类这里调用了一个类也就是保存价格的地方我遇到的问题是每当调用支付计算方法时都会得到NullPointerException

package Lab1;
import java.util.Scanner;
public class main{
public static void main(String[] args){
Car c = new Car("model",1998, 123);
ThirdPartyPolicy tp = new ThirdPartyPolicy("hello");
ComprehensivePolicy comp = new ComprehensivePolicy(2,31);

Scanner scan = new Scanner(System.in);
System.out.println("Input price of car");
c.price= scan.nextDouble(); 

tp.printtp();
comp.printcp();
comp.calcPayment();
}
}
class Car{
String model;
int ManufacturingYear;
double price;
//constructor
public Car(String model, int ManufacturingYear, int price){
this.model=model;
this.ManufacturingYear=ManufacturingYear;
this.price=0;

}
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;
public ThirdPartyPolicy(String comments){
this.comments=comments;
}
@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;
public ComprehensivePolicy(int level, int driverage){

this.level=level;
this.driverage=driverage;

}

public Car getCar() {
return car;
}
@Override
double calcPayment(){
this.premium = ((car.price/100)+(numberofclaims*200)+flatRate);
if (driverage<30){
this.premium += ((30-driverage)*50);
return premium;
}
return premium;
}
public void printcp(){
super.print();
}
}

如果有人能帮我解决这个问题,我将不胜感激

InsurancePolicies有一个从未初始化的Car变量,因此它默认为空。在调用de calculation之前,你应该通过policy的构造函数或某种set方法通知car。

我粘贴了您的代码并在本地运行。当出现提示时,我输入了"100"。下面是完整的输出:

Input price of car
100
0.0
0.0
Exception in thread "main" java.lang.NullPointerException: Cannot read field "price" because "this.car" is null
at ComprehensivePolicy.calcPayment(main.java:102)
at main.main(main.java:17)

为什么失败了?因为Car car;是在抽象类中声明的,并且代码试图使用它(car.price)而不首先赋值或创建Car对象。所以,car是空的,调用它的任何东西(比如"car.price")都会抛出NullPointerException。

这里有一个非常简单的修复方法来让它工作:在创建一个新的"ThirdPartyPolicy"之后,分配您之前创建的汽车:

Car c = new Car("model", 1998, 123);
...
ThirdPartyPolicy tp = new ThirdPartyPolicy("hello");
tp.car = c;

这样做之后,您将看到另一个异常,看起来与第一个相同。这是由于抽象类中的共享代码,同样带有null "car"这里有一个类似的简单修复程序,可以让它工作。

ComprehensivePolicy comp = new ComprehensivePolicy(2, 31);
comp.car = c;

在添加了这两行之后,程序可以正常运行。

这是一种更简洁的工作方式。

  1. 修改"ThirdPartyPolicy"构造函数需要一个Car参数,并保存引用(this.car = car):
    public ThirdPartyPolicy(Car car, String comments) {
    this.comments = comments;
    this.car = car;
    }
    
  2. "综合政策"也有类似的变化:
    public ComprehensivePolicy(Car car, int level, int driverage) {
    this.car = car;
    this.level = level;
    this.driverage = driverage;
    }
    
  3. 通过"汽车"对每个构造函数的引用:
    Car car = new Car("model", 1998, 123);
    ThirdPartyPolicy tp = new ThirdPartyPolicy(car, "hello");
    ComprehensivePolicy comp = new ComprehensivePolicy(car, 2, 31);
    

最新更新