方法和组成java

时间:2012-06-30 16:59:18

标签: java methods composition

我有一个带方法的门面引擎

getOwner() 

我还有另一个名为Car的类和另一个调用者所有者。 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类;然后允许我使用“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()方法时,我得到一个nullpointer异常,我相信这是因为没有创建对象。错误是从这里生成的:

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

我需要返回一个对象作为我的引擎类的结果。但是对象没有被创建。任何援助将不胜感激。

3 个答案:

答案 0 :(得分:0)

我多次查看了您的代码。我不明白你把车主与汽车联系在一起的地方。
这是导致NullPointerException的原因 我建议你提供一个CTOR给Car,它将Owner作为参数,另外,考虑使用setCar方法。

考虑使用以下汽车代码:

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;
    }
}

答案 1 :(得分:0)

样式注释:在引擎中,汽车应该也可能是private,就像其他字段一样,带有setter或构造函数参数。

似乎有些字段没有设置。我在类似情况下使用的一个调试“技巧”是临时创建字段final,并查看编译器抱怨的内容。例如,如果有人正在设置engine.car,它会抱怨。在这种情况下,这是一件好事 - 应该抱怨!而且,如果 nobody 正在设置engine.car,那就是NPE来自哪里的红旗。

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

答案 2 :(得分:0)

我从未实例化过对象,只对变量进行了删除。

将构造函数更改为

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

这成功创建了对象,这反过来允许我调用getOwner()方法而不是获取任何NullPointerExceptions。一定是错过了这部分。