我该如何解决这个“OutOfBoundaryException”错误?

时间:2013-12-10 11:31:21

标签: java class exception

import java.util.Scanner;

class DataInput {
String name[];
int korean[], math[], english[];
int sum[];
double average[];
int students;
int rank[];

public void save() {
    Scanner sc = new Scanner(System.in);
    System.out.println("Type in number of students");
    students = sc.nextInt();

    name = new String[students];
    korean = new int[students];
    math = new int[students];
    english = new int[students];
    sum = new int[students];
    average = new double[students];
    rank = new int[students];

    for (int i = 0; i < students; i++) {
        System.out.println("Type name");
        name[i] = sc.next();
        System.out.println("Type Korean score");
        korean[i] = sc.nextInt();
        System.out.println("Type math score");
        math[i] = sc.nextInt();
        System.out.println("Type English score");
        english[i] = sc.nextInt();

        sum[i] = korean[i] + math[i] + english[i];
        average[i] = sum[i] / 3.0;

    }

}

int stu() {
    return students;
}

int[] sum() {
    return sum;
}

}

class DataOutput {
DataInput data = new DataInput();
int sNum;
int[] rrank, sum;

DataOutput(int students, int[] sum) {
    this.sNum = students;
    this.rrank = new int[sNum];
    this.sum = sum;
}

void ranker() {

    int cnt = 1;

    for (int i = 0; i < sNum; i++) {
        for (int j = 0; j < sNum; j++) {
            if (sum[i] < sum[j]) {
                cnt++;
            }
        }
        rrank[i] = cnt;
        cnt = 1;
    }

}
}

public class Score {
public static void main(String[] args) {

    DataInput data = new DataInput();
    int sNum = data.stu();
    int[] sum = data.sum();
    DataOutput out = new DataOutput(sNum, sum);
    data.save();
    out.ranker();

    System.out.println();
    System.out.println("Name\t\tKorean  math  English \t sum  Average  Rank");
    System.out
            .println("-------------------------------------------------------");

    for (int i = 0; i < data.stu(); i++) {
        System.out.println(data.name[i] + "\t\t" + data.korean[i] + "  "
                + data.math[i] + "  " + data.english[i] + "\t"
                + data.sum[i] + "  " + data.average[i] + "  "
            + out.rrank[i]); // this is where i get an Exception
    }

}

}

所以,这是我获得学生排名的计划。但不知何故,当我运行代码时,我不断收到“OutOfBoundaryException”。我检查了我的代码,并意识到当我实例化一个新的DataOutput实例时,它会创建所有新数据。所以我尝试通过设置构造函数来解决这个问题。但是我仍然无法解决这个问题。我知道我可以将ranker方法放入DataInput类中,问题很容易解决,但我真的想保留DataOutput类。

感谢您的时间。

PS:在第98行抛出异常,out.rrank [i]

2 个答案:

答案 0 :(得分:2)

在调用students方法之前,您的save()字段未设置。 sNummain的值为0

main中的顺序更改为:

DataInput data = new DataInput();
data.save();// <--
int sNum = data.stu();
int[] sum = data.sum();
DataOutput out = new DataOutput(sNum, sum);
out.ranker();

答案 1 :(得分:1)

问题是你在创建学生之前初始化等级[]作为灵魂我建议你在收集学生/分数后初始化

public void init(int students, int[] sum){
      this.sNum = students;
        this.rrank = new int[sNum];
        this.sum = sum;
}

并更新main()

  DataOutput out = new DataOutput();
    data.save();

    int sNum = data.stu();
    int[] sum = data.sum();
    out.init(sNum, sum);
    out.ranker();