NullPointerException ..我逻辑中的缺陷在哪里?

时间:2011-06-15 17:54:19

标签: java nullpointerexception

在Main:

Equipe Eq1 = new Equipe(J,E);
Equipe Eq2 = new Equipe(J,E);
while(Eq1.equals(Eq2))
Eq2 = new Equipe(J,E);

Match m = new Match(Eq1,Eq2);
String ChercherJoueur = m.QuelEquipe(m.hasBall());

在Class Equipe中:

public Vector<Joueur> VJ;
public Equipe(Vector<Joueur> E, Vector<Entraineur> Ent) {
   VJ = new Vector<Joueur>();
   //rest of the logic
}
public Equipe() {
}

在课堂比赛中:

Equipe Eq1 = new Equipe();
Equipe Eq2 = new Equipe();
public Match(Equipe Eq1, Equipe Eq2) {
Eq1 = this.Eq1;
Eq2 = this.Eq2;
}

public String QuelEquipe(Joueur J)
{
    boolean found = Eq1.ChercherJoueur(J);
    if(found == true)
        return "EQ1";
    else
        return "EQ2";
}

public Joueur hasBall()
{
    Joueur J = null;
    int i = 0;
    boolean found = false;

NullPointerException------->  System.out.println(Eq1.VJ.get(i).isBall());

System.out.println(Eq2.VJ.get(i).isBall());
    while(!found)
    {

        if((Eq1.VJ.get(i).isBall())==true)
        {
            found = true;
            J= Eq1.VJ.get(i);
        }

        else if((Eq2.VJ.get(i).isBall())==true)
        {
            found = true;
            J= Eq2.VJ.get(i);
        }
        i++;
    }
return J;
}
}

我认为我需要在这里包含所有通知你的情况。当我执行“m.QuelEquipe(m.hasBall());”时,我得到一个NullPointerException。“这可以追溯到我在Class Match中指出的地方..我确切地知道异常意味着什么,并且我用“Eq1 = this.Eq1; Eq2 = this.Eq2;”来改变它们的引用。无论如何.. sooo在哪里流动以使代码工作?

3 个答案:

答案 0 :(得分:3)

您正在调用默认构造函数public Equipe(),它不会初始化VJ。如果你不打算使用它,只需删除构造函数。

答案 1 :(得分:3)

使用两个args的构造函数会初始化向量,但无参数构造函数不会

public Equipe(Vector<Joueur> E, Vector<Entraineur> Ent) {
    VJ = new Vector<Joueur>(); //<-- OK
    //rest of the logic
}
public Equipe() {
        //<-- errrk
}

然后当你调用:

System.out.println(Eq2.VJ.get(i).isBall());

你正在使用真正的调用:

Eq2.null.get  <-- NullPointerException 

真正的问题虽然在Match构造函数中:

public Match(Equipe Eq1, Equipe Eq2) {
    Eq1 = this.Eq1;
    Eq2 = this.Eq2;
}

在这里,你要为局部变量Eq1分配实际变量Eq1的值,你真的想要它反过来:

public Match(Equipe Eq1, Equipe Eq2) {
    this.Eq1 = Eq1;
    this.Eq2 = Eq2;
}
顺便说一句,这不是C#,而在Java中作为编码约定,方法和属性都以lowecase开头,而开括号也在同一行(尽管最后一部分与命名约定不相关)

我希望这会有所帮助。

答案 2 :(得分:0)

这将解决您的问题:

<强> Match.java

private final Equipe eq1;
private final Equipe eq2;
public Match(final Equipe eq1, final Equipe eq2) 
{
   this.eq1 = eq1;
   this.eq2 = eq2;
}