2013-12-17 8 views
0

У меня есть следующее сообщение об ошибке:Ошибка ArrayIndexOutOfBoundsException

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

Я новичок, и я не очень понимаю, где вещь получает stucked. Я полагаю, что где-то в for.

Некоторые справочные данные?

ГЛАВНЫЙ КЛАСС

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); 
     } 
    } 
} 
} 

КЛАСС Односпальная

public String nume; 
public int varsta; 

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

} 

общественности Строка getNume() {

возвращение NUME;

} 

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

public int getVarsta() 
{ 
    return varsta; 
} 

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

}

Patron КЛАСС

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;

patron gigel 45 100 5000;

+0

Какая линия точно равна 28? –

+3

Просьба предоставить полный исходный файл, включающий объявления класса + package и операторы импорта. Строка 28 в представленном фрагменте кода представляет собой пустую строку. В качестве альтернативы выделите выделенную или выделенную жирным шрифтом строку в приведенном выше примере, которая бросает исключение. – user2910265

+0

Просьба предоставить фрагмент вашего текстового файла. –

ответ

2

Когда вы s= linie.split(";"); вы принимаете (неправильное предположение), что всегда будет s[0], s[1], s[2], s[3] и s[4]. (Подумайте, что произойдет, когда ваш вход не содержит ;?).

Вы должны убедиться, что длина нужной длины равна s.

3

Вы не указали, что ваша строка ввода не содержит точку с запятой, и, следовательно, массив строк, возвращаемый split, не имеет второго элемента.

То же самое относится к последующим полям, к которым вы обращаетесь. Например, если строка имеет только одну точку с запятой, в строковом массиве не будет третьего элемента и так далее.

Вот краткое объяснение этого сообщения вы получаете:

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

Это говорит вам следующее:

  • Вы попытались получить доступ к элементу массива, который не существует.
  • Неверный индекс: 1
  • Это произошло в строке 28 исходного файла Main.java

Оснащенный этим знанием, вы могли бы найти ошибку самостоятельно. Ибо в этой строке есть только один доступ к массиву, который использует 1 как индекс.

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] 
Смежные вопросы