繁体   English   中英

数组超出绑定异常

[英]Array out of bound exception

我的计算机中有一个文本文件,我正在阅读我的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());
    }
}

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

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

这可能会有所帮助: Java InputStream编码/字符集

看来你正面临一些编码问题。 以相同的格式保存并读取文件。 优选使用UTF-8。 使用构造函数new FileInputStream(<fileDir>, "UTF8")进行读取。
如何在unicode中保存文件

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

要么找出你的文件的编码或将其转换为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的编码 (从1.5开始)

您提供的信息不准确。

使用以下代码从记事本中读取此内容时,我将获得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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM