链表删除节点触发NullPointerException异常的问题排查
链表删除节点空指针异常修复方案
错误根源分析
你遇到的NullPointerException是因为removeNode方法的循环条件和遍历逻辑存在三个关键问题:
- 循环用了
||(逻辑或),当cursor已经为null时,仍会执行cursor.getNext(),直接触发空指针 - 未处理头节点就是目标节点的场景
- 遍历过程中没判断
cursor.getNext()是否为null,可能在cursor.getNext().getData()处触发空指针
修正后的代码
public void removeNode(T data) { // 单独处理头节点为目标节点的情况 if (head != null && head.getData().equals(data)) { head = head.getNext(); return; } Node<T> cursor = head; // 循环条件:cursor非空、下一个节点存在、下一个节点数据不匹配 while (cursor != null && cursor.getNext() != null && !cursor.getNext().getData().equals(data)) { cursor = cursor.getNext(); } // 找到目标节点的前置节点,执行删除 if (cursor != null && cursor.getNext() != null) { cursor.setNext(cursor.getNext().getNext()); } else { System.out.println("Could not find node."); } }
关键修正点说明
- 头节点单独处理:如果头节点就是要删除的节点,直接将
head指向头节点的下一个节点即可 - 循环条件优化:用
&&(逻辑与)确保只有cursor、cursor.getNext()都不为null,且下一个节点数据不匹配时才继续遍历,避免空指针 - 数据匹配用equals:泛型
T的对象比较不能直接用!=,要用equals方法(如果T是自定义类,需要重写equals保证匹配正确性) - 删除前判空:执行删除操作前,再次确认
cursor.getNext()不为null,避免找不到节点时触发异常
内容的提问来源于stack exchange,提问作者user19758931
相关产品推荐
相关产品推荐

