Java学生成绩录入程序抛出数组越界异常,如何排查解决?
数组越界异常产生原因
- 类的成员变量
student为int类型,Java 中类的非静态成员整型变量默认初始值为0 - 数组
arr的初始化逻辑写在了类属性声明位置,此时类实例创建阶段尚未执行score()方法中读取用户输入、给student赋值的逻辑,实际执行的数组初始化语句等价于new int[0][5],即数组第一维长度为0 - 后续循环向
arr[i][j]写入成绩时,第一维没有任何可访问的索引,因此直接触发ArrayIndexOutOfBoundsException
具体修复方案
核心调整为将数组初始化时机延后到用户输入学生人数之后,具体修改点:
- 将原属性声明处的数组初始化语句改为仅声明数组,不在类创建阶段分配内存
- 在
score()方法中拿到用户输入的学生总人数后,再根据实际人数初始化二维数组
修复后完整代码:
import java.util.Scanner; public class Mid { Scanner scan = new Scanner(System.in); int student; // 仅声明数组,不提前初始化 int arr[][]; String str[]= {"science","math","english"}; public void score() { System.out.println("how many student?"); student=scan.nextInt(); // 获取学生人数后再初始化数组,第二维大小可根据后续存储需求调整 arr = new int[student][5]; for(int i=0;i<student; i++) { for(int j=0;j<3;j++) { System.out.println("input " + (i+1) + " student " + str[j] + " score"); arr[i][j]=scan.nextInt(); } } } }
补充说明:如果不需要预留数组第二维的额外空间(如后续存储总分、平均分等),可将数组初始化语句改为arr = new int[student][3],和科目数量一一对应。
内容的提问来源于stack exchange,提问作者banna
相关产品推荐
相关产品推荐

