Java StringTokenizer在csv文件中越界



我正在尝试读取一个简单的。csv文件并创建字符串的2D数组。下面是数组:

1,1,1,1,1,1
2,2,2,2,2,2
3,3,3,3,3,3
4,4,4,4,4,4

我的代码应该找到六列和四行,但它在第三列之后停止并移动到下一行,我不知道为什么会发生这种情况。

除此之外,即使提前退出,它也会返回一个越界异常。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6

下面是代码,后面跟着输出。

public String[][] ascToStringArray(String ascFileIn) {
    String directory ="c:\data\"; // "" is an illegal character
    String[][] numbers= new String[4][6]; // 4 rows 6 columns
    try{
        BufferedReader Br = new BufferedReader(new FileReader(directory + ascFileIn));
        String line;
        int row = 0;
        int col = 0;
        //read each line of text file
        while((line = Br.readLine()) != null)
        {
            StringTokenizer st = new StringTokenizer(line,",");
            //Populating Columns
            while (st.hasMoreTokens())
            {
                //get next token and store it in the array
                numbers[row][col] = st.nextToken();
                System.out.println(row + " " + col + " = " + st.nextToken());
                col++;
            }
            row++;
        }
        //close the file
        Br.close();
        return numbers;
    }
    catch(IOException exc) {
        System.out.println("Error reading file.");
        return numbers;
    }
}

输出如下:

0 0 = 1
0 1 = 1
0 2 = 1
1 3 = 2
1 4 = 2
1 5 = 2

如果有人能弄清楚为什么它提前退出,并抛出一个越界错误,无论我做多大的数组,我真的很感激。

您使用了两次nextToken

numbers[row][col] = st.nextToken();<-1---
System.out.println(row + " " + col + " = " + st.nextToken());<--2--Skips element

但是只使用一个值,所以一行中只会添加三个元素

异常原因

inner while循环执行后,您没有重置col=0,这导致ArrayIndexOutOfBound for col=6col size在数组中为6意味着0到5,因此当col=6 .

时将抛出异常。

首先,内部while循环中的system.out.println消耗一个令牌。其次,在进入内部while循环时,您应该重置cols文件。为零。

public String[][] ascToStringArray(String ascFileIn) {
    String directory = "c:\data\"; // "" is an illegal character
    String[][] numbers = new String[4][6]; // 4 rows 6 columns
    try {
        BufferedReader Br = new BufferedReader(new FileReader(directory + ascFileIn));
        String line;
        int row = 0;
        int col = 0;
        // read each line of text file
        while ((line = Br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(line, ",");
            col = 0;
            // Populating Columns
            while (st.hasMoreTokens()) {
                // get next token and store it in the array
                numbers[row][col] = st.nextToken();
                col++;
            }
            row++;
        }
        // close the file
        Br.close();
        return numbers;
    } catch (IOException exc) {
        System.out.println("Error reading file.");
        return numbers;
    }
}

这是因为您调用了两次st.nextToken(),在System.out.println中占用了一个额外的令牌。

相反,首先将其保存为String:

String token = st.nextToken();

则可以在打印和数组中使用相同的字符串

http://msdn.microsoft.com/fr-fr/library/aa989865(v=vs.80).aspx

StringTokenizer。nextToken():获取字符串中的下一个token在解析。

numbers[row][col] = st.nextToken();
System.out.println(row + " " + col + " = " + st.nextToken());

你遍历你的令牌而不使用它们!

相关内容

  • 没有找到相关文章

最新更新