You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java运行报NullPointerException:curr为null无法调用getRow()求助

Java代码空指针异常排查

报错直接原因

运行抛出的错误信息:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "positions.getRow()" because "curr" is null
at Main.main(Main.java:41)

触发报错的直接原因是执行curr=temp之后curr值为null,后续调用curr.getRow()时JVM无法在null对象上找到对应方法,直接抛出空指针。

代码里的根因点

你的代码存在4个会触发空指针/逻辑异常的问题:

  • 变量temp初始值为null,双层for循环只有满足p[i][j].equals(curr)的条件时才会进入分支给temp赋值。如果遍历完整个p数组都没有找到匹配curr的元素,temp会一直保持null值,执行curr=temp后curr就变成null,后续调用方法必然报错。
  • 就算成功进入p[i][j].equals(curr)的判断分支,原逻辑第一行就是while(temp.isVisited()!=true)——此时temp还没完成第一次赋值,本身就是null,直接调用isVisited()会比你现在遇到的curr为null报错更早触发空指针。
  • 调用curr.getpositions(p, curr)拿到列表k之后没有做非空判断,如果返回的列表长度为0,执行k.get(0)会直接抛出索引越界异常,temp也无法拿到有效值。
  • 内层while循环没有合法终止条件,只要temp的isVisited状态一直为false就会陷入死循环,不会正常走到后续赋值逻辑。

修复方案

按以下顺序调整代码即可解决问题:

  1. 进入内层while循环前先完成temp的初始赋值,禁止null值调用类方法
  2. 双层for循环执行结束后增加temp非空校验,没找到匹配元素时直接抛出业务异常或者终止循环,不要把null赋值给curr
  3. 拿到getpositions返回的列表后先判断是否为空,确认有元素再执行取值操作
  4. 内层while循环补充终止逻辑,选到符合要求的temp后及时更新访问标记、跳出循环

参考修正后的核心代码片段:

int count=0;
positions curr=new positions(0,0);

while(count!=64) {
    positions temp=null;
    for(int i=0; i<p.length; i++) {
        for(int j=0; j<p[0].length; j++) {
            if(p[i][j].equals(curr)) {
                // 先获取可用的相邻位置列表,空列表直接跳过
                ArrayList<positions> k = curr.getpositions(p, curr);
                if (k == null || k.isEmpty()) {
                    continue;
                }
                // 先给temp赋初始值再做状态判断
                temp = k.get(0);
                for(int l=1; l<k.size(); l++) {
                    if(k.get(l).getMoves()<temp.getMoves()) {
                        temp=k.get(l);
                    }
                }
                // 补充访问状态判断和循环终止逻辑,避免死循环
                while(temp != null && !temp.isVisited()) {
                    // 这里补充你的位置访问标记逻辑,比如temp.setVisited(true)
                    break;
                }
            }
        }
    }
    // 循环结束后校验temp非空,避免给curr赋null
    if (temp == null) {
        throw new RuntimeException("未找到下一个可移动的位置,遍历终止");
    }
    curr=temp;
    solution[curr.getRow()][curr.getCol()]=count;
    count++;
}

注意:你需要根据自己的业务逻辑补全位置访问标记的代码,否则即使不抛空指针也会陷入死循环。

内容的提问来源于stack exchange,提问作者coolcatpanther

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:51:22