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

如何解决Java静态函数中List构造及赋值相关的异常问题

问题根因梳理

  • 1. Scanner缓冲区残留换行符问题
    你在main方法里调用in.nextInt()读取菜单选项后,输入的换行符会残留在Scanner的输入缓冲区中,后续新增患者时调用in2.nextLine()会直接读取到这个空的换行符,导致姓名输入直接被跳过,你会误以为数据没存进去。
  • 2. 患者计数变量作用域错误
    你把actualPatientsNumber定义为isExit方法的局部变量,每次调用该方法都会被重置为0,这个计数完全失效。而且你根本不需要自己维护计数,直接调用List自带的listToDisplay.size()方法就能拿到当前已存的患者数量。
  • 3. Patient类未重写toString方法
    你在打印列表时直接把Patient对象拼接进StringBuilder,默认会打印对象的内存地址,和你预期的患者信息格式不符,你会误以为列表是空的没有输出。
  • 4. 初始版本的exit参数值传递问题(你调整后的代码已经修复了该问题)
    Java基本数据类型是值传递,初始版本里你在isExit方法里修改形参exit的值,根本不会影响main方法里的exit变量,会导致程序无法正常退出。

修复方案

第一步:修复Scanner换行问题

main方法中读取完菜单选项后,新增一行代码吃掉残留的换行符:

int nr = in.nextInt();
in.nextLine(); // 新增这行,清除nextInt留下的换行符

第二步:替换患者计数逻辑

把isExit方法里的计数判断换成List的size判断,删除没用的actualPatientsNumber局部变量:

// 原if (actualPatientsNumber < MaxPatientsAmount) 改成下面的
if (listToDisplay.size() < MaxPatientsAmount) {
    Patient tmp = new Patient(name, secondName, PEELER);
    listToDisplay.add(tmp);
} else {
    System.out.println("患者数量已达上限10人,无法新增");
}

第三步:给Patient类重写toString方法

在Patient类中新增如下方法:

@Override
public String toString() {
    return name + " " + secondName + " ,PESEL编号:" + PEELER + "\n";
}

第四步:优化exit逻辑(可选)

你调整后的代码已经把exit的赋值放在main里,可以正常退出,不需要额外修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:06:00