Dlaczego wywala wyjątek ArrayIndexOutOfBoundsException?

Dlaczego wywala wyjątek ArrayIndexOutOfBoundsException?
Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

Cześć wszystkim :) Mam taką klasę:

Kopiuj
 public class FIFOtab {
    private int rozmiarTablicy;
    private int size = 0;

    public FIFOtab(int rozmiar){
        rozmiarTablicy = rozmiar;
    }

    Student[] kolejkaTab = new Student[rozmiarTablicy];

    public void enqueueTab(Student student){
        for (int i=0; i<=size; i++) {
            //if (i >= rozmiarTablicy) throw new FullQueueException("FullQueueException");
            if (kolejkaTab[i] == null){                                     //<-------------------
                kolejkaTab[i] = new Student(student.index,student.imie,student.nazwisko,student.ocena);
                size++;
            }
        }
    }
}

Wywołuję konstruktor:

Kopiuj
FIFOtab fifoTab = new FIFOtab(5);

Teraz chcę dodać pierwszego studenta do kolejki:

Kopiuj
Student student1 = new Student("12345678", "Jan", "Kowalski", 2.5);
fifoTab.enqueueTab(student1);

Wywala mi błąd w tym ifie w którym dodałem "strzałeczkę":

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

Wie ktoś dlaczego tak się dzieje?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Student[] kolejkaTab = new Student[rozmiarTablicy]; // to się zrobi przed konstruktorem kiedy to rozmiarTablicy jest wciąż zerem.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Bo nie ma znacznia że zadeklarowałeś pole pod konstrukturem? Inicjalizacja tego pola i tak wyląduje na początku konstruktora! W efekcie
Student[] kolejkaTab = new Student[rozmiarTablicy];
wykona sie ZANIM przypiszesz wartość rozmiar i masz tablicę na 0 elementów. W takiej sytuacji inicjalizacja tego pola powinna być zrobiona całkowicie w konstruktorze.

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0
_13th_Dragon napisał(a):

Student[] kolejkaTab = new Student[rozmiarTablicy]; // to się zrobi przed konstruktorem kiedy to rozmiarTablicy jest wciąż zerem.

Ok, poprawione, wyjątek jednak i tak jest bez zmian ;)

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0
Shalom napisał(a):

Bo nie ma znacznia że zadeklarowałeś pole pod konstrukturem? Inicjalizacja tego pola i tak wyląduje na początku konstruktora! W efekcie
Student[] kolejkaTab = new Student[rozmiarTablicy];
wykona sie ZANIM przypiszesz wartość rozmiar i masz tablicę na 0 elementów. W takiej sytuacji inicjalizacja tego pola powinna być zrobiona całkowicie w konstruktorze.

Ale kiedy zrobię to w konstruktorze, inne funkcje w klasie nie widzą tablicy ;/

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2
Kopiuj
 public class FIFOtab {
    private Student[] kolejkaTab;
    public FIFOtab(int rozmiar){
        kolejkaTab = new Student[rozmiar]; // dalej zamiast rozmiarTablicy używaj: kolejkaTab.length;
    }
...
szweszwe
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1694
0

Zrób w ten sposób:

Kopiuj
 public class FIFOtab {
    private int rozmiarTablicy;
    private int size = 0;
    private Student[] kolejkaTab;
 
    public FIFOtab(int rozmiar){
        kolejkaTab = new Student[rozmiar];
    }
    .
    .
    .
}
 
     
Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

Wielkie dzięki Wam wszystkim :) A jeszcze mam pytanie, kiedy wykonam

Kopiuj
 private Student[] kolejkaTab;

    public FIFOtab(int rozmiar){
        kolejkaTab = new Student[rozmiar];
    }

To wtedy mam tablicę w której mam same nulle tak?

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
2

Sprawdź. :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.