为什么ArrayList返回错误:ArrayIndexOutOfBoundsException

时间:2015-11-10 15:01:28

标签: java arraylist

我不知道为什么会这样。我逐行读取我的文本文件,通过拆分切割线并将它们保存到ArrayList。但是如果文件超过100行,我的程序将无法工作,因此它会在split命令中返回错误。我想知道我的电脑是否内存不足?

每个人都可以说明白了吗?先谢谢你。 这是我的代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.JOptionPane;
class Vocab implements Comparable<Vocab>{
    private String vocab;
    private String explanation;
    public Vocab(String vocab, String explanation) {
        this.vocab = vocab;
        this.explanation = explanation;
    }
    public int compareTo(Vocab that){
        return this.vocab.compareTo(that.vocab);
    }    
    public String getVocab() {
        return vocab;
    }
    public void setVocab(String vocab) {
        this.vocab = vocab;
    }
    public String getExplanation() {
        return explanation;
    }
    public void setExplanation(String explanation) {
        this.explanation = explanation;
    }
}
public class Test {
    public static void readFile(String fileName, ArrayList<String> a) throws FileNotFoundException {
        try {
            File fileDir = new File(fileName);
            BufferedReader in = new BufferedReader(
                new InputStreamReader(
                    new FileInputStream(fileDir), "UTF8"));
        String str;
        while((str= in.readLine())!= null){
               a.add(str);                 
        }
        in.close();
        }         
        catch (IOException e) 
        {
            JOptionPane.showMessageDialog(null,"Something in database went wrong");
        }                    
    }        
    public static void main(String[] args) throws FileNotFoundException {
        // TODO code application logic here
        ArrayList<Vocab> a= new ArrayList<Vocab>();
        ArrayList<String> b= new ArrayList<String>();
        readFile("DictVE.dic",b);
        for (String t: b){
            String[] temp= t.split(":");
            a.add(new Vocab(temp[0].trim(), temp[1].trim()));// error in here
        }
    }    
}

这是我的档案:DictEV.dic

1 个答案:

答案 0 :(得分:4)

String.split(String) method中存在一个微妙的问题,即从字符串的末尾丢弃空标记:

  

因此,结尾的空字符串不包含在结果数组中。

所以:

System.out.println("Hello:".split(":").length); // Prints 1.

您可以通过将负int作为第二个参数传递来保留空字符串:

System.out.println("Hello:".split(":", -1).length); // Prints 2.