首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java数组(java.lang.NullPointerException)

Java数组(java.lang.NullPointerException)
EN

Stack Overflow用户
提问于 2013-10-02 07:16:56
回答 2查看 146关注 0票数 1

我的java代码中出现了这个错误,我似乎找不出我做错了什么。

代码语言:javascript
复制
java.lang.NullPointerException
at Race.toString(Race.java:94)
at TestA2Classes.start(TestA2Classes.java:39)
at TestA2.main(TestA2.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

这是其中一个java文件的代码。问题似乎围绕着我使用数组的部分。我做错了什么?

代码语言:javascript
复制
public class Race {
public static final String[] RACE_DESCRIPTIONS = {"Sprint", "Distance", "Eliminator", "Keirin"};
public static final int SPRINT = 0;
public static final int DISTANCE = 1;
public static final int ELIMINATOR = 2;
public static final int KEIRIN = 3;
public static final int MAX_COMPETITORS = 8;

private int number;
private int typeIndex;
private MyDate date;
private boolean hasFinished;
private Competitor[] competitors;
private int numberOfCompetitors;

public Race(int number, int typeIndex, MyDate date) { 
    // TODO
    this.number = number;
    this.typeIndex = typeIndex;
    this.date = date;
    this.hasFinished = false;
    this.numberOfCompetitors = 0;
    Competitor[] competitors = new Competitor[MAX_COMPETITORS];

}

public int getNumber() {
    // TODO
    return number;
}

public boolean getHasFinished() {
    // TODO
    return hasFinished;
}

public int getTypeIndex() {
    // TODO
    return typeIndex;
}

public MyDate getDate() {
    // TODO
    return date;
}

public Competitor getCompetitor(int number) {
    // TODO
    Competitor competitor = competitors[0];
    for(int i=0; i<competitors.length; i++){
        if(competitors[i].getNumber() == number){
            return competitor;
        }
    }
    return null;
}

public void finishRace(int first, int second, int third) { 
    // TODO
    this.hasFinished = true;
    for(int i=0; i<competitors.length; i++){
        if(competitors[i].getNumber() == first){
            competitors[i].setPosition(1);
        } else if(competitors[i].getNumber() == second){
            competitors[i].setPosition(2);
        } else if(competitors[i].getNumber() == third){
            competitors[i].setPosition(3);
        } else{
            competitors[i].setPosition(0);
        }
    }
}

public boolean addCompetitor(Competitor competitor) {
    // TODO
    if(numberOfCompetitors < MAX_COMPETITORS){
        numberOfCompetitors++;
        return true;
    }
    return false;
}

public String toString() {
    // TODO

    String details = number + ", " + RACE_DESCRIPTIONS[typeIndex] + " [" + date + "]";
    if(hasFinished = false){
        details += ": Race not finished";
    } else if(hasFinished = true){
        details += "\n     1st: " + competitors[1].getName();
        details += "\n     2nd: " + competitors[2].getName();
        details += "\n     3rd: " + competitors[3].getName();
    }
    return details;
}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-02 07:18:28

下面是构造函数中的问题:

代码语言:javascript
复制
Competitor[] competitors = new Competitor[MAX_COMPETITORS];

您不是在初始化member variable competitors,而是要在构造函数中创建local competitors variable。因此,您的实例数组变量没有初始化,将为null。由于您的数组将保持统一,因此请更改这里提到的构造函数:

代码语言:javascript
复制
public Race(int number, int typeIndex, MyDate date) { 
    // TODO
    this.number = number;
    this.typeIndex = typeIndex;
    this.date = date;
    this.hasFinished = false;
    this.numberOfCompetitors = 0;
    this.competitors = new Competitor[MAX_COMPETITORS];

}

正如Rohit在他的评论中指出的那样,您的代码中还有另一个问题。您没有初始化竞争对手数组元素。如果要创建新元素,则需要对每个元素执行新的操作,否则数组将不为空,但每个竞争者元素实际上将为空。对这些元素调用任何方法都会导致NullPointerException。

票数 2
EN

Stack Overflow用户

发布于 2013-10-02 07:20:29

问题1

在构造函数中删除并将其移到声明数组的位置。

代码语言:javascript
复制
 Competitor[] competitors = new Competitor[MAX_COMPETITORS];

当然,在使用它之前,您必须先填充它们。

问题2

toString()

代码语言:javascript
复制
 if(hasFinished = false){
        details += ": Race not finished";
    } else if(hasFinished = true){
        details += "\n     1st: " + competitors[1].getName();
        details += "\n     2nd: " + competitors[2].getName();
        details += "\n     3rd: " + competitors[3].getName();
    }

你在if条件下初始化布尔变量.不是比较.

那应该是

代码语言:javascript
复制
public String toString() {
    String details = number + ", " +  
                             RACE_DESCRIPTIONS[typeIndex] + " [" + date + "]";
    if(!hasFinished){
        details += ": Race not finished";
    } else{
        details += "\n     1st: " + competitors[1].getName();
        details += "\n     2nd: " + competitors[2].getName();
        details += "\n     3rd: " + competitors[3].getName();
    }
    return details;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19131757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档