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

为何这段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无需修改,保持原样即可。


修复说明

  1. 把链表实例的创建移到循环外,确保所有操作都是针对同一个链表,不会丢失之前添加的元素;
  2. 在addrear方法中增加空链表判断,直接把新节点设为头节点,避免空指针异常;
  3. 给case 2添加break语句,保证分支逻辑独立,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:23:10