0

我在尝试修复ArrayIndexOutOfBoundsException.

我有一种方法可以逐行读取文件。如果该行上的名称和 id 与我传递给该方法的某些变量匹配,那么我将该行保存到一个数组中。

该程序模拟测验。用户不能使用相同的name和id超过2次;因此,该文件仅包含 2 行具有相同名称和 id 的行。

我创建了一个名为的数组temp来保存文件中的这两行。如果文件为空,则用户进行两次尝试,当他再次尝试时,他被拒绝。因此,如果您输入不同的名称和 ID,您应该再尝试 2 次。此时文件中有两行来自前一个用户,但是当新用户尝试时,他只能参加一次测试。当他第二次尝试时,我得到了数组越界异常。

我的问题是:数组是否包含temp以前的值,这就是我得到异常的原因吗?

private String readFile(String id, String name) {
    String[] temp = new String[3];
    int i = 1;
    int index = 0;
    String[] split = null;
    String idCheck = null;
    String nameCheck = null;
    temp = null;

    try {
        BufferedReader read = new BufferedReader(new FileReader("studentInfo.txt"));
        String line = null;           

        try {
            while ((line = read.readLine()) != null) {
                try {
                    split = line.split("\t\t");
                } catch (Exception ex) {
                }

                nameCheck = split[0];
                idCheck = split[1];

                if (idCheck.equals(id) && nameCheck.equals(name)) {
                    temp[index] = line;
                }

                index++;
            }
            read.close();
        } catch (IOException ex) {
        }
    } catch (FileNotFoundException ex) {
    }

    if (temp != null) {
        if (temp[1] == null) {
            return temp[0];
        }
        if (temp[1] != null && temp[2] == null) {
            return temp[1];
        }
        if (temp[2] != null) {
            return temp[2];
        }
    }

    return null;
}
4

3 回答 3

1

我看到两个地方可以让索引越界异常。首先是这段代码:

try {
    split = line.split("\t\t");
} catch (Exception ex) {
}
nameCheck = split[0];
idCheck = split[1];

如果该行没有"\t\t"序列,则split只有一个元素,尝试访问split[1]将引发异常。(顺便说一句:你不应该默默地忽略异常!)

第二个(更可能是问题的根源)是您正在index为具有匹配 id 和 name 的每一行递增,因此一旦您阅读第三行这样的行,index作为temp.

您可以包含index < temp.lengthwhile循环条件中,也可以使用ArrayList<String>fortemp代替String[]. 这样您就可以添加无限数量的字符串。

于 2012-12-12T19:37:35.830 回答
0

这就是可能发生的事情

    String[] split = "xxx\tyyyy".split("\t\t");
    System.out.println(split[0]);
    System.out.println(split[1]);

.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Test.main(Test.java:17)
于 2012-12-12T19:36:47.127 回答
0

设置后temp = null;

下一个对 temp 的引用是:

if (idCheck.equals(id) && nameCheck.equals(name)) {

    temp[index] = line;
}

我相信您应该删除该行temp = null;。它所做的只是将您刚刚在该行上方实例化的数组丢弃。

这个索引让我有点紧张,但我想如果你确定正在读取的文件永远不会超过 3 行......

于 2012-12-12T19:43:32.223 回答