0

我有一个带有方法的外观引擎

getOwner() 

我还有另一个名为 Car 的类和另一个调用者 Owner。Car 类也有一个 getOwner() 方法,而 Owner 类包含名称、汽车的成本和所有者的预算。

所以我有一个初始化引擎的方法,它调用了 newCARengine 类中的构造函数。

public static void iniEngine(String name, int cost) {
    model = new newCARengine(name, cost);
}

作品。引擎类有汽车,汽车类有所有者。为了成功调用 getOwner() 方法,我需要使用实例变量(类级别变量)来保存对另一个对象的引用,以便从该对象调用该方法。

我的引擎课程:[下]

public class engine{
    private String name;
    private int cost;
    public Car car;

    public engine(String name, int cost){
        this.name = name;
        this.cost = cost;
    }

   public Owner getOwner(){
        return car.getOwner();
    }
}

我通过使用该类“公共汽车汽车”的实例变量来引用汽车类;然后允许我使用“car.getOwner();” 方法。

我的车类:[下]

public class Car{
    public Owner owner //instance variable to reference the owner class
    public Owner getOwner(){
        return owner;
    }
}

现在我准备去创建 Owner 对象的 Owner 类。

我的所有者班级:[下]

public class Owner{
    private String name;
    private int cost;
    private int budget;

    public Owner (String name, int cost){
        this.name = name;
        this.cost = cost;
    }
    public Owner (String name, int cost, int budget){
        this.name = name;
        this.cost = cost;
        this.budget = budget;
    }
    public String getName(){return name;}
    public int getCost(){return cost;}
    public int getBudget(){return budget;}
}

现在我做错了,因为当我运行 iniEngine() 方法时,我得到一个空指针异常,我相信这是没有创建对象的结果。错误是从这里生成的:

return car.getOwner();  //from the ENGINE CLASS

由于我的引擎类,我需要返回一个对象。但该对象没有被创建。任何援助将不胜感激。

4

3 回答 3

0

我从不实例化对象,只删除变量。

通过将构造函数更改为

public Engine(String name, int cost) {
    car = new Car(new Owner(name, cost));       
}

这成功地创建了对象,这反过来又允许我调用 getOwner() 方法并且没有得到任何 NullPointerExceptions。一定以某种方式错过了这部分。

于 2012-07-02T17:00:00.177 回答
0

我多次查看了您的代码。我不明白你在哪里将车主与汽车联系起来。
这就是导致 NullPointerException 的原因,
我建议您向 Car 提供一个 CTOR,以获取 Owner 作为参数,此外,考虑使用 setCar 方法。

考虑对 Car 使用以下代码:

public class Car{
    public class Car(Owner owner) {
      this.owner = owner;
    }
    private Owner owner //instance variable to reference the owner class

    public void setOwner(Owner owner) {
       this.owner = owner;
    }
    public Owner getOwner(){
        return owner;
    }
}
于 2012-06-30T17:03:51.763 回答
0

样式说明:在 Engine 中, car 可能也应该是private,就像其他字段一样,带有一个 setter 或一个构造函数参数。

似乎有些字段没有设置。我在类似情况下使用的一种调试“技巧”是临时制作 fields final,看看编译器抱怨什么。例如,如果有人在设置engine.car,它会抱怨。在这种情况下,这是一件好事——它应该抱怨!而且,如果没有人在设置engine.car,那就是关于 NPE 来自何处的危险信号。

或者,如果您确实有 setter/getter,请在其中放置断点(或者,如果您愿意,添加 System.out.prints)以验证它们是否被调用。或者,暂时重命名它们(我在开头添加“xxx”)以验证编译器是否抱怨,证明有人在调用它们。

于 2012-06-30T17:35:55.810 回答