Error ArrayIndexOutOfBoundsException

时间:2013-12-17 15:43:16

标签: java arrays exception

我有以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 
    1 at test.Main.main(Main.java:28)

我是初学者,我真的不明白事情会被困在哪里。我认为for中的某个地方。

有些帮助吗?

MAIN CLASS

public static ArrayList<Patron> patr_list= new ArrayList<Patron> ();
public static ArrayList<Angajat> angj_list= new ArrayList<Angajat> ();

public static ArrayList<Persoana> pers_list = new ArrayList<Persoana>();

public static void main(String []args) throws Exception
{
    BufferedReader flux_in= new BufferedReader (new InputStreamReader (new FileInputStream("C:/Users/Administrator/workspace/test/test.txt")));
    String linie;

    while((linie= flux_in.readLine()) != null)
    {
        String [] s;
        s= linie.split(";");
        if(linie.contains("angajat"))
        {
            angj_list.add(new Angajat( s[0], Integer.parseInt(s[1]), Calendar.getInstance(), s[3], s[4] ));
        }
        else 
            if(linie.contains("patron"))
            {
                patr_list.add(new Patron(s[0], Integer.parseInt(s[1]), Integer.parseInt(s[2]), Integer.parseInt(s[3])));
            }

        pers_list.addAll(patr_list);
        pers_list.addAll(patr_list);


        System.out.println(String.format("Nume", "Varsta", "Data_angajarii", "Loc de munca", "Functia"));
        for( Angajat angj: angj_list)
        {
            System.out.println(angj);
        }

        System.out.println(String.format("Nume", "Varsta", "Nr de firme", "Nr de angajti"));
        for( Patron patr: patr_list)
        {
            System.out.println(patr);
        }
    }
}
}

Persoana CLASS

public String nume;
public int varsta;

public  Persoana (String nume, int varsta)
{
    this.nume=nume;
    this.varsta=varsta;

}

public String getNume(){

return nume;

}

public void setNume(String nume)
{
    this.nume = nume;
}

public int getVarsta() 
{
    return varsta;
}

public void setVarsta(int varsta)
{
    this.varsta = varsta;
}

}

赞助人CLASS

public int nr_firme;
public int nr_angajati;

public Patron(String nume, int varsta, int nr_firme, int nr_angajati)
{
    super(nume,varsta);
    this.nr_firme=nr_firme;
    this.nr_angajati=nr_angajati;
}

public int getNr_firme() 
{
    return nr_firme;
}

public void setNr_firme(int nr_firme) 
{
    this.nr_firme = nr_firme;
}

public int getNr_angajati() 
{
    return nr_angajati;
}

public void setNr_angajati(int nr_angajati)
{
    this.nr_angajati = nr_angajati;
}

public String toString()
{
    return "Patronul are" + nr_firme + "firme si" + nr_angajati+ "numar de angajti";        

}

Angajat CLASS

public Calendar data_angajarii;
public String loc_munca;
public String functie;

public Angajat(String nume, int varsta, Calendar data_angajarii, String loc_munca, String functie) 
{
    super(nume, varsta);
    this.data_angajarii=data_angajarii;
    this.loc_munca=loc_munca;
    this.functie=functie;

}

public Calendar getData_angajarii()
{
    return data_angajarii;
}

public void setData_angajarii(Calendar data_angajarii) 
{
    this.data_angajarii = data_angajarii;
}

public String getLoc_munca() 
{
    return loc_munca;
}

public void setLoc_munca(String loc_munca)
{
    this.loc_munca = loc_munca;
}

public String getFunctie()
{
    return functie;
}

public void setFunctie(String functie) 
{
    this.functie = functie;
}

public String toString()
{
    return "Angajatul a fost angajat in data de" + data_angajarii + "lucreaza la " + loc_munca+ " si are functia de " + functie;        

}

文字文件

angajat ionel 16 1991,8,4 timisoara director;

patron gigel 45 100 5000;

3 个答案:

答案 0 :(得分:3)

您没有提供输入字符串不包含分号的情况,因此split返回的字符串数组没有第二个元素。

同样扩展到您访问的后续字段。例如,如果string只有1个分号,则字符串数组中不会有第3个元素,依此类推。

以下是您收到的消息的简短说明:

java.lang.ArrayIndexOutOfBoundsException: 
   1 at test.Main.main(Main.java:28)

这告诉您以下内容:

  • 您试图访问不存在的数组元素。
  • 错误的索引是1
  • 它发生在源文件Main.java的第28行

掌握了这些知识,你可以自己找到错误。因为,在该行中,只有一个数组访问使用1作为索引。

答案 1 :(得分:2)

执行s= linie.split(";");时,您会假设(错误的假设)始终存在s[0]s[1]s[2]s[3]和{{1} }}。 (想想当你的输入不包含s[4]时会发生什么?)。

您应该验证;是否具有您期望的长度。

答案 2 :(得分:0)

这是你的问题'

  

angajat ionel 16 1991,8,4 timisoara director;

     

patron gigel 45 100 5000;

你按";"分裂。 ";"位于该行的末尾。因此s[0]是整行,之后没有s[1]或任何索引。

而是由此"[\\s;]"拆分。这应该工作。这将由空格和分号分开。

分手后这样做

String name = s[0] + " " s[1]; // This will concatenate the first two indices

检查此图表以查看正确的指数。

new Angajat( s[0], Integer.parseInt(s[1]), Calendar.getInstance(), s[3], s[4])

         angajat ionel      16                 1991,8,4         timisoara  director

             name          s[2]                 s[3]               s[4]      s[5]

new Patron(s[0], Integer.parseInt(s[1]), Integer.parseInt(s[2]), Integer.parseInt(s[3])

         patron gigel      45                 100                      5000

            name           s[2]                s[3]                     s[4]