Java作业求助:ArrayIndexOutOfBoundsException错误排查修复
解决ArrayIndexOutOfBoundsException的问题
嘿,我来帮你搞定这个报错!咱们先拆解一下你代码里的几个问题,然后给你修正后的版本:
问题分析
1. 构造函数里的直接越界
你在类里声明int n;的时候,Java会给它默认赋值为0,所以int [] rollno = new int[n];其实创建了一个长度为0的空数组。然后你在构造函数里写rollno[n] = 0;,也就是试图给rollno[0]赋值,但长度为0的数组根本没有索引0,这就是你看到的Result.<init>(Result.java:15)报错的根源。
2. 数组初始化时机完全错了
你是先创建了Result BSCS = new Result();对象,之后才给BSCS.n赋值,但数组在对象创建的那一刻就已经用初始值为0的n初始化完成了——也就是说,数组长度始终是0,后面循环里访问BSCS.name[i]这些操作肯定会继续越界。
3. 数组索引使用不符合Java规则
Java数组的索引是从0开始的,但你的循环写的是for(int i =1; i<=BSCS.n; i++),就算数组长度是n,最大合法索引也是n-1,访问i=n的时候又会触发越界错误。
修正后的代码
import java.util.Scanner; public class Result { int n; int[] rollno; int[] marks; String[] name; // 空构造函数,先不初始化数组 Result() { } public static void main(String[] args) { Scanner cin = new Scanner(System.in); Result BSCS = new Result(); System.out.println("Enter number of students "); BSCS.n = cin.nextInt(); // 拿到学生数量后,再初始化对应长度的数组 BSCS.rollno = new int[BSCS.n]; BSCS.marks = new int[BSCS.n]; BSCS.name = new String[BSCS.n]; // 数组索引从0开始,显示序号时用i+1保证符合用户习惯 for(int i = 0; i < BSCS.n; i++) { System.out.println("Enter Name of " + (i+1) + " student"); BSCS.name[i] = cin.next(); System.out.println("Enter RollNO of " + (i+1) + " student"); BSCS.rollno[i] = cin.nextInt(); System.out.println("Enter Marks of " + (i+1) + " student"); BSCS.marks[i] = cin.nextInt(); } System.out.println("|No\t|Name\t|RollNo\t|Marks "); // 同样用j+1作为显示的序号,数组索引用j for(int j = 0; j < BSCS.n; j++) { System.out.println("|" + (j+1) + "\t|" + BSCS.name[j] + "\t|" + BSCS.rollno[j] + "\t|" + BSCS.marks[j]); } cin.close(); // 记得关闭输入流,养成好习惯 } }
额外优化建议(面向对象写法)
如果你想更贴合Java的面向对象思想,可以改成带参数的构造函数,提前传入学生数量来初始化数组:
import java.util.Scanner; public class Result { int n; int[] rollno; int[] marks; String[] name; // 带参数的构造函数,直接初始化数组 Result(int studentCount) { this.n = studentCount; this.rollno = new int[n]; this.marks = new int[n]; this.name = new String[n]; // 给姓名数组设置默认值"NA" for(int i=0; i<n; i++) { this.name[i] = "NA"; } } public static void main(String[] args) { Scanner cin = new Scanner(System.in); System.out.println("Enter number of students "); int count = cin.nextInt(); // 创建对象时直接传入学生数量 Result BSCS = new Result(count); for(int i = 0; i < BSCS.n; i++) { System.out.println("Enter Name of " + (i+1) + " student"); BSCS.name[i] = cin.next(); System.out.println("Enter RollNO of " + (i+1) + " student"); BSCS.rollno[i] = cin.nextInt(); System.out.println("Enter Marks of " + (i+1) + " student"); BSCS.marks[i] = cin.nextInt(); } System.out.println("|No\t|Name\t|RollNo\t|Marks "); for(int j = 0; j < BSCS.n; j++) { System.out.println("|" + (j+1) + "\t|" + BSCS.name[j] + "\t|" + BSCS.rollno[j] + "\t|" + BSCS.marks[j]); } cin.close(); } }
这样代码结构更清晰,也避免了对象创建后再修改成员变量的问题。
内容的提问来源于stack exchange,提问作者user12137661
相关产品推荐
相关产品推荐

