1

我想放弃,但我必须这样做,所以你是我最后的希望。我想这是一个简单的问题,但我看不出有什么问题。这是代码:

    int i = -1;
    String[][] dan = new String[20][13];
    try {
     FileReader odczytanie = new FileReader("Kontrahenci.txt");
     BufferedReader bufor = new BufferedReader(odczytanie);
     String str;
     str = bufor.readLine();
     System.out.println(str);
     while ((str = bufor.readLine()) != null) {
        i = i + 1;
        String[] ar = {null, null, null, null, null, null, null, null, null, null, null, null, null};
        ar=str.split("; ");
        for(int j = 0; j < 13; j++)
            dan[i][j] = ar[j];
        for(int j = 0; j < 13; j++)
            System.out.println(dan[i][j]);  
     }
     bufor.close();
    } catch (IOException e) {
           System.out.println("File Read Error");
        }

因此,当我尝试运行它时,我收到此错误:

"Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1"

对于这一行:

for(int j = 0; j < 13; j++)
    System.out.println(ar[j]);

在一个文件中,我有三行用分号分隔的单词。该代码适用于第一行,但在我收到错误之后。不知道出了什么问题。

4

3 回答 3

0

硬编码 13 似乎有点可疑。您设置的值ar会被要拆分的分配覆盖。ar 不再一定有 13 个字段。关于什么

for (int j = 0; j < ar.length ; j++)

甚至更好

for (String s: ar) 

该数据必须以某种方式格式不正确或不是您所期望的。尝试断言正确的尺寸或打印它。

正如 Jerry 所指出的,固定大小的数组是不好的做法。最好使用一些更高级别的集合,例如 HashMap 列表或其他自动增长的集合。

权宜之计是在使用 i 索引之前检查它i < 20,然后抛出异常或断言。这将为您指明正确的方向。您也可以将其添加到您的 while 循环中,但这可能会使数据未读。

于 2013-05-31T16:08:36.907 回答
0
String[] ar = {null, null, null, null, null, null, null, null, null, null, null, null, null};
ar=str.split("; ");

这个ar带有 13 个空值的声明将立即被 覆盖str.split("; ");,因此您不能假设数组的大小将始终为 13。而不是使用 13 作为 for 循环的上限,我建议使用ar.len或尝试使用 for每个循环。

我怀疑你的阵列也会有同样IndexOutOfBoundsError的情况。dan

你应该避免使用幻数。

于 2013-05-31T16:11:40.393 回答
0

您应该在创建数组之前确定文件中有多少行,或者切换到允许大小更改的内容:

ArrayList<String[]> dan = new  ArrayList<String[]>();
try
{
    BufferedReader bufor = new BufferedReader(new FileReader("Kontrahenci.txt"));
    while (bufor.ready())
    {
        dan.add(bufor.readLine().split("; "));
    }
    bufor.close();
}
catch (IOException e)
{
    System.out.println("File Read Error");
}

for(String[] ar : dan)
{
    for(String s : ar)
    {
        System.out.println(s);
    }
}

我没有更改您的错误处理,但请注意,close如果有异常,您将不会调用。

于 2013-05-31T18:01:52.510 回答