Java StringTokenizer与.CSV文件的超出范围

时间:2014-07-02 15:00:08

标签: java indexoutofboundsexception stringtokenizer

我正在尝试阅读一个简单的.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

如果有人能够弄清楚为什么它会提前退出并且无论我制作数组多大都会让我失误,我会非常感激。

4 个答案:

答案 0 :(得分:2)

首先,内部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;
    }
}

答案 1 :(得分:2)

您正在使用nextToken两次。

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

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

例外原因

执行内部循环后,您没有重置col=0,这导致ArrayIndexOutOfBound col=6 col size in array 6 表示0到5,因此在col=6时会抛出异常。

答案 2 :(得分:0)

这是因为您正在调用st.nextToken()两次,吞噬System.out.println中的额外令牌。

相反,首先将其保存为字符串:

String token = st.nextToken();

然后你可以在你的打印和数组中使用相同的字符串。

答案 3 :(得分:0)

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

  

StringTokenizer.nextToken():获取字符串中的下一个标记   在解析期间。

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

你在不使用它们的情况下通过你的代币!