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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:34