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就会陷入死循环,不会正常走到后续赋值逻辑。
修复方案
按以下顺序调整代码即可解决问题:
- 进入内层while循环前先完成temp的初始赋值,禁止null值调用类方法
- 双层for循环执行结束后增加temp非空校验,没找到匹配元素时直接抛出业务异常或者终止循环,不要把null赋值给curr
- 拿到getpositions返回的列表后先判断是否为空,确认有元素再执行取值操作
- 内层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
相关产品推荐
相关产品推荐

