为何这段Java链表尾部添加操作的代码执行时抛出错误?
让我来帮你排查这个尾部添加操作抛出错误的问题,我看了你的代码,发现了几个关键问题:
问题1:每次循环都创建新的链表实例
在Main.java的while循环里,你每次都执行new methods(),这意味着用户每次选择操作时,都是在一个全新的空链表上操作——之前添加的元素会直接丢失,而且第一次选add rear时,链表的head是null,直接调用temp.getNext()就会触发NullPointerException。
问题2:addrear方法未处理链表为空的边界情况
当链表是空的(head为null),temp = head会让temp变成null,这时候执行temp.getNext()就会抛出空指针异常,因为null对象不能调用任何方法。
问题3:case 2缺少break语句
在switch的case 2分支里,你没有添加break,导致执行完addrear后会自动执行case 3的display操作,这虽然不是报错的直接原因,但会导致逻辑不符合预期。
修复后的代码
Main.java
import java.util.*; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 将链表实例移到循环外,保证所有操作针对同一个链表 methods list = new methods(); while (true) { System.out.println("1-> add front 2->add rear 3->display"); System.out.println("enter your choice"); int ch = in.nextInt(); switch (ch) { case 1: { System.out.println("Enter the element to add"); int newAdd = in.nextInt(); list.addfront(newAdd); } break; case 2: { System.out.println("Enter the element to add"); int newAdd = in.nextInt(); list.addrear(newAdd); } break; // 添加break,避免执行后续分支 case 3: list.display(); break; default: System.exit(0); } } } }
Methods.java
public class methods { node head; public void addfront(int data) { node n= new node(data); if(head!=null) n.setNext(head); head=n; } public void addrear(int data) { node n = new node(data); // 先处理链表为空的情况 if (head == null) { head = n; return; } node temp= head; while(temp.getNext()!=null) { temp=temp.getNext(); } temp.setNext(n); } public void display() { node current = head; while(current!=null) { System.out.println(current); current=current.getNext(); } } }
node.java无需修改,保持原样即可。
修复说明
- 把链表实例的创建移到循环外,确保所有操作都是针对同一个链表,不会丢失之前添加的元素;
- 在
addrear方法中增加空链表判断,直接把新节点设为头节点,避免空指针异常; - 给case 2添加break语句,保证分支逻辑独立,符合预期。
内容的提问来源于stack exchange,提问作者masterStroke
相关产品推荐
相关产品推荐

