如何解决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
相关产品推荐
相关产品推荐

