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

Java初学者开发学生信息录入功能确认环节报错求助

问题报错核心原因
  • 空指针异常(NullPointerException):你初始化了Student icsClass[] = new Student[10]; 这个数组仅分配了10个Student类型的引用空间,每个位置默认值为null,并未实例化具体的Student对象。你直接执行icsClass[0].setYear(2010)时,相当于调用null的成员方法,就会触发空指针报错,这是你当前问题的核心诱因。
  • Scanner输入逻辑不一致:前面所有录入环节均使用nextLine()读取整行输入,确认环节你使用了next()读取yes/no输入,next()只会读取到分隔符(空格、换行)前的内容,用户输入yes后残留的换行符会留在输入缓冲区,下一轮循环的第一个nextLine()会直接读取到空字符串,触发非空校验报错。
  • 逻辑漏洞:用户确认信息后没有对应更新计数器,选择yes后没有将数据存入数组对应位置,选择no后也没有重置当前学生对象,会导致后续存储逻辑异常。
修复方案
  1. 数组元素赋值前先实例化:将存储逻辑改成先为数组对应下标实例化Student对象,再调用set方法赋值,参考代码:
if (vConfirm.equals("yes")) {
    // 先实例化数组对应位置的Student对象
    icsClass[counter] = new Student();
    // 把当前录入的st对象属性赋值给数组元素
    icsClass[counter].setFName(st.getFName());
    icsClass[counter].setlName(st.getLName());
    icsClass[counter].setYear(st.getYear());
    icsClass[counter].setMonth(st.getMonth());
    icsClass[counter].setDay(st.getDay());
    // 计数器自增,进入下一个学生录入
    counter++;
}
// 选择no不需要操作counter,直接进入下一轮循环重新录入
  1. 统一Scanner读取方式:将确认环节的vConfirm = s.next();改为vConfirm = s.nextLine();,如果存在输入残留问题,可以在读取确认信息前加一行s.nextLine()吃掉缓冲区残留的换行符。
  2. 补充异常校验:可以给Integer.parseInt(sInput)加try-catch包裹,避免用户输入非数字内容时触发数字格式转换异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:36:02