读取导入的txt时出现JAVA:ArrayIndexOutOFBoundException

时间:2014-10-24 12:24:08

标签: java arrays exception

我是初学者,我有一个txt文件,用户将导入到java中,我将读取txt文件行为line然后在每行上设置变量base并将它们添加到当前记录

    public void importTXT() {
    JFileChooser fc = new JFileChooser();
    fc.setAcceptAllFileFilterUsed(false);
    fc.setMultiSelectionEnabled(false);
    FileNameExtensionFilter filter = new FileNameExtensionFilter(
            "TEXT FILES", "txt", "text");
    fc.setFileFilter(filter);
    int returnVal = fc.showOpenDialog(CollectionFrame.this);
    String[] numstrs = null;
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File importedFile = fc.getSelectedFile();

        try {
            Scanner sc = new Scanner(importedFile);
            while (sc.hasNextLine()) {
                numstrs = sc.nextLine().split("\\s+"); // split by white
                                                        // space
            }
        } catch (IOException e) {

        }
        // add new collection
        Collection newCollection = new Collection(numstrs[0]);
        allRecord.addCollection(newCollection);

        // add art consignment information
        String consignmentName = numstrs[3];
        String description = numstrs[4];

我在倒数第二行收到ArrayIndexOutOfBoundsException

String consignmentName = numstrs[3];

文本文件的内容如下:

Richman’s Estate Collection
5
ART
Water Lilies
A superb piece in great condition

有人可以告诉我出了什么问题吗?

3 个答案:

答案 0 :(得分:0)

编辑: 您目前正在阅读所有行并每次更换numstrs的值 所以当你离开循环时,你只得到了最后一行的值。
我想你要保存所有线路 - 见下文 结束编辑

你应该使用arraylist。

像这样:

ArrayList<String[]> numstrsList = new ArrayList<String[]>();
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File importedFile = fc.getSelectedFile();

        try {
            Scanner sc = new Scanner(importedFile);
            while (sc.hasNextLine()) {
                numstrsList.add(sc.nextLine().split("\\s+")); // split by white
                                                        // space
            }
        } catch (IOException e) {

        }
}

你可以通过以下方式捕捉你的arraylist的值:

for(int i=0:i<numstrsList.size();i++){
    String[] oneLineStrArray = numstrsList.get(index)
    //do something 
}

你应该发布文本数据,否则我们无法帮助你解决OutOfBounds错误。 另外,我想知道如何实例化集合。

答案 1 :(得分:0)

正如之前的评论已经提出的那样,该文件显然不包含您期望的表单中的信息。 我建议您在扫描仪阅读后添加som错误处理。

if (numstrs.length < 5){
  ///TODO: add some handling here, exception or error dialog
}

答案 2 :(得分:0)

在这里,首先浏览ArrayIndexOutOfBoundsException

在尝试访问索引值之前检查numstrs长度。你可以做到

String consignmentName = null, description = null;
if (numstrs.length >= 4) {
    consignmentName = numstrs[3];
}
if (numstrs.length >= 5) {
    description = numstrs[4];
}

另外,正如其中一条评论所指出的那样 - numstrs将始终具有最后一行返回的值。