-3

当我用变量声明数组大小时,我得到 ArrayIndexOutOfBoundsException,但当我用数字声明它时却没有。

    static Student[] readFile(String filename) {
    .........

    LineNumberReader lnr = null;
    try {
        lnr = new LineNumberReader(new FileReader(new File(filename)));
        lnr.skip(Long.MAX_VALUE);
        len = lnr.getLineNumber();
        lnr.close();
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    len--; // discount the first line
    len = (len > 40) ? 40 : len;
    Student[] s = new Student[len]; <------- replacing len with a number resolves it

    try {
        f = new BufferedReader(new FileReader(new File(filename)));
        while ((line = f.readLine()) != null) {
            ......... 

            s[roll] = new Student(SID, marks); <--- Exception thrown here
            roll++;

            if (roll == 41) {
                f.close();
                throw new CustomException("41st Student!!");
            }
        }
        f.close();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (CustomException e) {
        System.out.println("Too many students in the class!");
    }

    return s;
}

有人可以解释一下为什么当编译器本身不知道界限时,编译器会认为我越界了,len?

谢谢!

4

5 回答 5

4

ArrayIndexOutOfBoundsException是一个RuntimeException。如果发生这种情况,那么您肯定会越界。做之前
检查是否。roll < lens[roll] = new Student(SID, marks);

另请注意,数组在 Java(和大多数语言)中是基于 zeor 的。因此,如果您有一个 size 数组N,则索引是从0N - 1(的总和N)。

于 2013-09-09T09:26:34.850 回答
0
len = (len > 40) ? 40 : len;

len 的值有两种情况,这两种情况都可能导致越界异常:

一个。上述语句执行后,假设 len 被初始化为 40 值,那么称为 s 的数组的长度为 40。

s[roll] = new Student(SID, marks);

假设 roll 的值为 40。然后,您正在为索引 40 分配一个值,即 s[40] = value,索引的有效范围是 0 到 39。因此,抛出 ArrayIndexOutOfBoundsException

湾。假设 len 小于 40。

s[roll] = new Student(SID, marks); 

在这里,一旦您为索引分配一个大于 len 大小的值,您就会遇到 ArrayIndexOutOfBoundsException

建议:在语句中赋值之前,添加一个数组大小在允许范围内的测试,如下:

if(roll < len)
{
    s[roll] = new Student(SID, marks); 
}
于 2013-09-09T09:40:48.537 回答
0
s[roll] = new Student(SID, marks); <--- Exception thrown here
roll++;

if (roll == 41) {
    f.close();
    throw new CustomException("41st Student!!");
}

你用 size 声明你的数组40。这意味着您可以访问0-39. 然后您尝试将新Student对象添加到40and 41。您的if声明期望值41.

于 2013-09-09T09:27:30.323 回答
0
len = (len > 40) ? 40 : len;

在这里,您将数组长度的上限设置为 40。如果您的文件包含超过 40 行,它将在此处给出 arrayOutofBound 异常:

 s[roll] = new Student(SID, marks); <--- Exception thrown here

所以你确定你的文件永远不会超过 40 行。如果不是这样,那么就像之前有人指出的那样颠倒比较。

     len = (len > 40) ? len : 40;
于 2013-09-09T09:31:20.973 回答
0
  1. 你在哪里定义了变量“len”?它是哪种类型的?应该是“int”
  2. 变量“roll”从何而来?哪种类型有卷?也应该是“int”

确保使用 int 值作为数组索引。许多简单类型可以自动转换为 int,但结果可能出乎意料。

确保“滚动”永远不会高于您的数组大小!

请记住,数组索引从零开始!但大小加一。最终出现在:

String[] myArr = new String[5];
myArray.length == 5
myArray[0] == First entry
myArray[4] == Last entry!!!

简单循环:

for (int i = 0; i < myArray.length; i++)

希望对您有所帮助,但通常您的步进调试器应该为您回答此类问题。

于 2013-09-09T09:34:04.457 回答