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

Java医疗预约系统添加人员功能:输入跳过与空指针报错求助

问题解决方案

问题1:输入姓名环节被直接跳过

原因:Scanner.nextInt()仅读取整数,输入身份证号后按下回车,换行符会留在输入缓冲区,后续Scanner.nextLine()会直接读取这个换行符,导致姓名输入被跳过。

解决方法:每次调用nextInt()后,调用r.nextLine()清空缓冲区的换行符;或统一用nextLine()读取输入后转换为对应数据类型。

问题2:NullPointerException空指针异常

原因:Person people[] = new Person[9];仅创建了能容纳9个Person对象的数组,但数组内每个元素默认是null,没有实际创建Person实例,直接调用people[0].setPerson()会触发空指针异常。同时当前代码固定往people[0]添加人员,会覆盖已有数据,需改为往数组空位置依次添加。


修正后的完整代码

Person类(需补充实现)

public class Person {
    private int id;
    private String name;
    private int tel;

    public Person() {}

    public Person(int id, String name, int tel) {
        this.id = id;
        this.name = name;
        this.tel = tel;
    }

    public void setPerson(int id, String name, int tel) {
        this.id = id;
        this.name = name;
        this.tel = tel;
    }

    // 重写toString,查看人员时显示可读信息
    @Override
    public String toString() {
        return "人员信息:身份证号=" + id + ", 姓名=" + name + ", 电话号码=" + tel;
    }
}

修正后的Menu类

import java.util.Scanner;
public class Menu {
    Person people[] = new Person[9];
    private int personCount = 0; // 记录已添加人员数量

    public Menu() {}

    void showMenu(){
        Scanner r = new Scanner(System.in);
        int option;
        do {
            System.out.println("==== 医疗预约管理 ====");
            System.out.println("1 - 添加人员");
            System.out.println("2 - 查看人员");
            System.out.println("3 - 预约挂号");
            System.out.println("4 - 取消预约");
            System.out.println("5 - 查看所有预约");
            System.out.println("6 - 平均预约时长");
            System.out.println("7 - 按日期统计平均预约时长");
            System.out.println("8 - 保存预约记录");
            System.out.println("9 - 读取预约记录");
            System.out.println("0 - 退出");
            System.out.println("请选择所需操作:");
            
            // 处理非整数输入,避免程序崩溃
            while (!r.hasNextInt()) {
                System.out.println("请输入有效的数字选项!");
                r.next();
            }
            option = r.nextInt();
            r.nextLine(); // 吃掉换行符,避免后续nextLine读取空内容

            switch(option){
                case 1: 
                    addPerson(r);
                    break;
                case 2: 
                    showPeople();
                    break;
                case 0:
                    System.out.println("退出系统");
                    break;
                default:
                    System.out.println("无效选项,请重新选择");
            }
        } while (option != 0); // 循环显示菜单直到退出
    }

    public void showPeople(){
        System.out.println("==== 已存储人员信息 ====");
        for (int i =0 ; i< personCount ; i++){
            System.out.println(people[i]);
        }
        if (personCount == 0) {
            System.out.println("暂无存储人员");
        }
    }

    public void addPerson(Scanner r) {
        if (personCount >= people.length) {
            System.out.println("人员存储已满,无法添加新人员");
            return;
        }

        int nId;
        String name;
        int nTel;

        System.out.println("请输入身份证号:");
        while (!r.hasNextInt()) {
            System.out.println("请输入有效的整数身份证号!");
            r.next();
        }
        nId = r.nextInt();
        r.nextLine(); // 清空换行符

        System.out.println("请输入人员姓名:");
        name = r.nextLine().trim();
        while (name.isEmpty()) {
            System.out.println("姓名不能为空,请重新输入:");
            name = r.nextLine().trim();
        }

        System.out.println("请输入电话号码:");
        while (!r.hasNextInt()) {
            System.out.println("请输入有效的整数电话号码!");
            r.next();
        }
        nTel = r.nextInt();
        r.nextLine(); // 清空换行符

        // 创建Person实例并存入数组
        Person newPerson = new Person();
        newPerson.setPerson(nId, name, nTel);
        people[personCount] = newPerson;
        personCount++;

        System.out.println("人员添加成功!");
    }
}

Main类(保持原样)

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Menu menu = new Menu();
        menu.showMenu();
    }
}

关键修改说明

  1. 解决输入跳过问题:每次nextInt()后用r.nextLine()清空换行符,统一传递同一个Scanner对象避免缓冲区混乱。
  2. 解决空指针异常:添加人员时先创建Person实例,再存入数组,而非直接调用null对象的方法。
  3. 优化添加逻辑:用personCount计数器实现依次添加,避免覆盖数据,同时判断数组是否已满。
  4. 增强输入校验:拦截非整数输入、空姓名输入,提升程序稳定性。
  5. 优化交互逻辑:用do-while循环实现菜单重复显示,符合系统使用场景。
  6. 重写toString:查看人员时展示可读信息,而非对象内存地址。

内容的提问来源于stack exchange,提问作者José Filipe Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:34:50