调试Array和for-loop + if语句

时间:2016-01-04 16:21:48

标签: java arrays if-statement for-loop error-handling

我构建了一个方法,用于将对象属性与用户输入int进行比较。然后,该方法将所有对象添加到数组中(赋值要求它是Array而不是ArrayList)。添加之后,我有一个foor-loop,它打印出一个运动员的结果列表(在用户输入中),它打印出一个类别的所有结果,然后是另一个类别等等......

我在最后一行是System.out.println时遇到NullPointerException错误。我已经搜索了几个小时的答案,并在这里阅读了NullPointerException帖子,但无法找到问题或解决它。

    for (int x = 0; x < category.size(); x++) {
        Category c = categories.get(x);
        System.out.println("Result in " + c.categoryName() + " for " + matchedAthlete.surName() + " "
                + matchedAthlete.lastName() + ": ");
        for (int i = 0; i < individarrayresult.length; i++) {
            Result res = individarrayresult[i];
            if (res.nameOfCategory().equals(c.categoryName())) {
                System.out.println(res.categoryResult());
            }
        }
    }

所以最后一行代码(System.out.println)得到了NullPointerException,我很想得到帮助。下面是仅有1名运动员的阵列。

     Result[] individarrayresult = new Result[resultlist.size()];

    for (int i = 0; i < resultlist.size(); i++) {
        Result res = resultlist.get(i);
        if (res.athleteStartNumber() == DSN) {
            individarrayresult[i] = res;
        }
    }

2 个答案:

答案 0 :(得分:3)

如果该行有NullPointerException

System.out.println(res.categoryResult());

问题在方法categoryResult中,因为 res不为空,除了之前的测试

if (res.nameOfCategory().equals(c.categoryName())) {

必须在System.out之前抛出NullPointerException。

请检查categoryResult()的代码或发布。

也许,正如T.J.说,问题不在那一行,而是在前一行,NullPointerException与res的值有关。发布代码的完整StackTrace和行行以确保答案。

答案 1 :(得分:2)

我认为你错了,我认为你早些时候在这条线上获得NPE一行:

if (res.nameOfCategory().equals(c.categoryName())) {

你获得它的原因是你的数组中有null个,因为你是如何填充的:

Result[] individarrayresult = new Result[resultlist.size()];

for (int i = 0; i < resultlist.size(); i++) {
    Result res = resultlist.get(i);
    if (res.athleteStartNumber() == DSN) {
        individarrayresult[i] = res;
    }
}

如果res.athleteStartNumber() == DSN为false,则永远不会向individarrayresult[i]分配任何内容,以便数组条目保持其null默认值。

如何修复它:

建立匹配结果列表:

List<> individResults = new Arraylist<Result>(resultlist.size());

for (int i = 0; i < resultlist.size(); i++) {
    Result res = resultlist.get(i);
    if (res.athleteStartNumber() == DSN) {
        individResults.add(res);
    }
}

...然后直接使用该列表,或将其转换为数组:

Result[] individarrayresult = individResults.toArray(new Result[individResults.size()]);

...并使用生成的数组。

(你也可以在最新版本的Java中使用漂亮的新流程做同样的事情,但我并不是真的与他们相处......)

当然,您可能会在您说过的线路上获得NPE并且存在两个问题,并且它恰好发生在您身上#39到目前为止,我们一直在处理所有DSN条目。如果是这样,并且您修复了另一个问题,那么当您第一次拥有非DSN条目时,除非同时修复此问题,否则您将遇到此问题。