有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java NullPointerException。。我的逻辑缺陷在哪里?

总的来说:

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());

课堂设备:

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这可以追溯到我在班级比赛中指出的地方。。我确切地知道异常的含义,我正在用“Eq1=this.Eq1;Eq2=this.Eq2;”更改它们的引用无论如何sooo让代码运行的流程在哪里


共 (3) 个答案

  1. # 1 楼答案

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

    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中,作为一种编码约定,方法和属性都以小写开头,大括号放在同一行(尽管最后一部分与命名约定没有那么大关系)

    我希望这有帮助

  2. # 2 楼答案

    这将解决您的问题:

    匹配。java

    private final Equipe eq1;
    private final Equipe eq2;
    public Match(final Equipe eq1, final Equipe eq2) 
    {
       this.eq1 = eq1;
       this.eq2 = eq2;
    }
    
  3. # 3 楼答案

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