数组超出绑定异常

时间:2013-07-11 07:54:31

标签: java string split

我的计算机中有一个文本文件,我正在阅读我的java程序,我想建立一些标准。这是我的记事本文件:

   #Students
   #studentId   studentkey  yearLevel   studentName token   
   358314           432731243   12          Adrian      Afg56       
   358297           432730131   12          Armstrong   YUY89       
   358341           432737489   12          Atkins      JK671   

        #Teachers
        #teacherId  teacherkey    yearLevel teacherName token   
        358314          432731243   12          Adrian      N7ACD       
        358297          432730131   12          Armstrong   EY2C        
        358341          432737489   12          Atkins      F4NGH

使用以下代码从记事本中读取此内容时,我会得到Array超出绑定的异常。在调试时,我得到strLine.length()的“#Students”值。 谁能帮忙解决这个问题?

private static Integer STUDENT_ID_COLUMN = 0;
private static Integer STUDENT_KEY_COLUMN = 1;
private static Integer YEAR_LEVEL_COLUMN = 2;
private static Integer STUDENT_NAME_COLUMN = 3;
private static Integer TOKEN_COLUMN = 4;

public static void main(String[] args) {
    ArrayList<String> studentTokens = new ArrayList<String>();

    try {
        // Open the file that is the first
        // command line parameter
        FileInputStream fstream = new FileInputStream("test.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;
        // Read File Line By Line
        while ((strLine = br.readLine()) != null) {
            strLine = strLine.trim();

            if ((strLine.length()!=0) && (strLine.charAt(0)!='#')) {
                String[] students = strLine.split("\\s+");
                studentTokens.add(students[TOKEN_COLUMN]);
            }


        }

        for (String s : studentTokens) {
            System.out.println(s);
        }

        // Close the input stream
        in.close();
    } catch (Exception e) {// Catch exception if any
        System.err.println("Error: " + e.getMessage());
    }
}

4 个答案:

答案 0 :(得分:1)

考虑了charakter-sets,也许该文件被认为是Unicode,但是你要求ASCII?你可以在这里改变:

BufferedReader br = new BufferedReader(new InputStreamReader(in, charakterset));

这有助于:Java InputStream encoding/charset

答案 1 :(得分:1)

您似乎面临着一些编码问题。以相同的格式保存并读取文件。优选使用UTF-8。使用构造函数new FileInputStream(<fileDir>, "UTF8")进行阅读 How to save a file in unicode

答案 2 :(得分:1)

您的文件编码可能与您正在阅读的内容不同。

要么找出文件的编码或将其转换为UTF8,那么在您的代码中使用下面的编码将其读入。

此外,您应该将strLine.charAt(0)!='#'更改为!strLine.contains("#"),除非保证它是第一个字符,并且可能出现在其他字段之一

对于你捕获的任何例外情况,调用printStackTrace()也是一个好主意

public static void main(String[] args) {
   ArrayList<String> studentTokens = new ArrayList<String>();

   try {
       // Open the file that is the first
       // command line parameter
       FileInputStream fstream = new FileInputStream(new File("C:\\Fieldglass\\workspace-Tools\\Tools\\src\\tools\\sanket.txt"));

  // ------ See below, added in encoding, you can change this as needed if not using utf8
       BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF8"));

       String strLine;
       // Read File Line By Line
       while ((strLine = br.readLine()) != null) {
           strLine = strLine.trim();

           if ((strLine.length()!=0) && (!strLine.contains("#"))) {
               String[] students = strLine.split("\\s+");
               studentTokens.add(students[TOKEN_COLUMN]);
           }
       }

       for (String s : studentTokens) {
           System.out.println(s);
       }

       // Close the input stream
       fstream.close();
       br.close();  // dont forget to close your buffered reader also
   } catch (Exception e) {// Catch exception if any
       e.printStackTrace();
       System.err.println("Error: " + e.getMessage());
   }
}

你可以在这里查看Java supported encodings(从1.5开始)

答案 3 :(得分:1)

您提供的信息不准确。

  

使用以下代码从记事本中读取此内容时,我将获得Array超出限制的异常。

如果代码和输入符合您的要求,我无法看到这是如何实现的。我能看到的唯一可以抛出ArrayIndexOutOfBoundsException的地方就是这一行:

  students[TOKEN_COLUMN]

但是我对你的代码和输入的阅读是到目前为止的每个输入行都有5个字段。拆分时,将为您提供包含5个元素的数组,students[TOKEN_COLUMN]将起作用。

IMO,无论是程序还是输入都不是您所描述的。 (我的猜测是你的输入行少于5个字段。)

  

调试时我得到strLine.length()的“#Students”值。

令人难以置信的是,这是奇怪的。 strLine.length()会返回int。你向我们展示的是一个字符串。


实际上,我对所发生的事情有所了解。如果"  #Students"strLine(不是strLine.length() !!)的值,那么您在某种程度上设法在文件的开头获得了一些垃圾。当您的代码检查到这一点时,第一个字符将不会为“#”,并且该行似乎有2个字段而不是5.这将导致异常......

我想我知道垃圾来自哪里。它是一个UTF-8字节顺序标记,由NotePad插入到文件的开头...因为您将文件保存为UTF-8。然后使用CP1252将文件读取 ...这是(我推测)您系统的默认字符集。

课程:不要使用记事本。使用真实的编辑器。

参考:https://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding