【问题标题】:Debugging Array and for-loop + if statement调试数组和 for-loop + if 语句
【发布时间】:2016-04-08 07:34:42
【问题描述】:

我已经建立了一个比较对象属性和用户输入 int 的方法。然后该方法将所有对象添加到一个数组中(分配要求它是一个数组而不是 ArrayList)。添加后,我有一个 foo 循环,它打印出运动员的结果列表(在用户输入中),它打印出一个类别的所有结果,然后是另一个类别,依此类推..

我在最后一行 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;
        }
    }

【问题讨论】:

  • 请发布完整的堆栈跟踪。 (但我认为@DavideLorenzoMARINO 有正确的答案)。
  • @AndyTurner:我本来打算发表一些极客主题的评论,比如“我发现你缺乏信心令人不安”,但你的评论比我的回答早了几分钟,所以...... :-)

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


【解决方案1】:

如果您在该行上有 NullPointerException

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

问题出在方法categoryResult因为res不为空,否则上个测试

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

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

所以检查categoryResult()的代码或发布它。


也许,就像 T.J.说,问题不在该行而是在前一行,并且 NullPointerException 与 res 的值有关。发布代码的完整 StackTrace 和行行以确保得到该答案。

【讨论】:

  • "如果您在该行有 NullPointerException:" 当然,如果他们是正确的,但他们一定是误报了,因为他们的代码'已经引用了。
  • 我认为至少问题是正确的(不是代码)。
【解决方案2】:

我认为你错了,我认为你在这一行之前获得了 NPE:

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

你得到它的原因是你的数组中有nulls,因为你是如何填充它的:

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 为假,则永远不会为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,并且存在 两个 问题,而恰好您一直在处理所有 DSN 条目,所以远的。如果是这样,并且您修复了另一个问题,那么当您第一次有一个非 DSN 条目时,您将遇到这个问题,除非它也修复它。

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 2013-09-02
    • 2017-07-17
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多