使用split()数组索引Out Of Bounds但在循环中读取数组

时间:2015-11-08 13:20:08

标签: java arrays string file split

我正在编写一个java代码,它从列中读取文件中的文本,但是当尝试运行代码时,出现了一个超出界限的错误。仅当我尝试使用命令时才会发生这种情况:arr [1](或更高的索引)。奇怪的是,以下代码工作正常:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadingColumns {
public static void run(){
  BufferedReader br = null;
    String[] characters = new String[10000];

    try {

        String sCurrentLine;
        br = new BufferedReader(new FileReader("C:\\Users\\wyn_005 trans.tif.txt"));

        int i=0;
        while ((sCurrentLine = br.readLine()) != null) {

            String[] arr = sCurrentLine.split("\\t");

            for(int j=0;j<arr.length;j++){
                System.out.println(arr[j]);
            }
           // System.out.println(sCurrentLine);
          //  System.out.println("arr[0] = " + arr[0]); 
           //  System.out.println(arr[2]);

            i++;
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}}

` 循环工作正常(整个行一个元素一个,然后下一个循环迭代中的下一行,依此类推)如果我尝试使用arr [0]输入它也没关系,但只给出了第一列。

`System.out.println(sCurrentLine)`

给出了整个文件,所以我知道它没有遗漏任何东西。 该文件看起来或多或少像这样:

Frame             X1   Y1   Marker1 R1    X2   Y2  Marker2 R2...
Data from 1 to 20
1                 1.0  2.0          3.2  4.0   3.1    *    5.5
2                 3.3  1.2          4.1  1.1   2.1         1.3
...

(抱歉,我不知道如何在此处用制表符分隔列,因此它是用空格制作的。) 谁能告诉我为什么会这样?我对java很新,所以也许我错过了一些简单的东西。

编辑: 取消注释行System.out.println(arr [2])时抛出异常; 的System.out.println(arr.length);每次迭代都会给出133。

2 个答案:

答案 0 :(得分:0)

你在选项卡上分裂。如果arr [1],但arr [0]有效,则sCurrentLine不包含选项卡。如果你正在使用

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

然后在循环内你不应该使用任何&gt; arr.length,在这个错误的情况下,是1.所以你可以安全地使用arr [j],但你不能随意使用任何arr [number],除非你确认该数字在范围内(0,arr.length)。 / p>

答案 1 :(得分:0)

您的文件可能不包含制表符,但可以包含4个空格来缩进列。这就是为什么按选项卡字符拆分会给出大小为1的数组。尝试拆分此模式:

sCurrentLine.split("\\s+");

此模式包括空格和制表符。