Kurs Java Podstawy - rozszerzony

ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException jest klasą wyjątku, z którą bardzo często spotykają się młodzi programiści, szczególnie, gdy stawiają swoje pierwsze kroki z tablicami.

Jest to wyjątek z grupy wyjątków nieobsługiwanych, czyli dziedziczących po klasie RuntimeException. Znajduje się w pakiecie java.lang, więc pełna ścieżka do klasy to java.lang.ArrayIndexOutOfBoundsException i należy ją zaimportować.

Wyjątek ten może wystąpić w sytuacji, w której próbujemy odwołać się do elementu tablicy lub struktury danych wykraczając poza jej rozmiar. Przykładowo jeżeli tablica przechowuje 5 elementów, to pierwszy index, do którego możemy się odwołać to 0, a ostatni to 4 (tablice numerujemy od 0). Wielu początkujących programistów zapomina o tym fakcie i chcąc wyświetlić ostatni element, próbuje odwołać się do elementu o indeksie 5, a ten nie istnieje.

Z bardzo podobną sytuacją spotkamy się w przypadku kolekcji w Javie. Przykładowo mając listę - niezależnie, czy ArrayList, czy LinkedList, nie możemy się odwołać do elementu o indeksie 10, jeżeli w liście jest tylko 10 elementów. Metoda get() rzuci w takiej sytuacji wyjątek IndexOutOfBoundsException (klasa nadrzędna dla ArrayIndexOutOfBoundsException).

Przykład 1

public class Main {
    public static void main(String[] args) {
        int[] tablica = {1, 2, 3, 4, 5};
        System.out.println(tablica[5]);
    }
}

Stworzyliśmy tablicę pięciu liczb 1, 2, 3, 4, 5 i chcemy wyświetlić ostatnią z nich. Przez pomyłkę odwołujemy się do ostatniego elementu jako tablica[5], a nie tablica[4] i w wyniku otrzymujemy wyjątek:

arrayindexoutofboundsexception

W komunikacie widzimy błędy index, do którego próbujemy się odwołać (5) oraz wiersz, w którym wyjątek wystąpił Main.java:5

Obsługa wyjątku w bloku try-catch

Jeżeli wyjątek zależy od danych wprowadzonych przez użytkownika, a nie jest na sztywno zapisany w kodzie, to możemy go przechwycić w bloku try-catch i poinformować o tym użytkownika.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int[] tablica = {10, 20, 30, 40, 50};
        Scanner sc = new Scanner(System.in);
        
        System.out.println("Który element tablicy wyświetlić?");
        int index = sc.nextInt();
        sc.close();
        try {
            System.out.println(tablica[index]);
        } catch(ArrayIndexOutOfBoundsException e) {
            System.err.println("Podałeś indeks wykraczający poza rozmiar tablicy!");
        }
    }
}

Podobnie jak w poprzednim przykładzie stworzyliśmy tablicę pięciu liczb - 10, 20, 30, 40, 50 i pytamy użytkownika, który element chce wyświetlić. Oczekujemy, że poda liczbę z przedziału od 0 do 4, jednak gdy poda liczbę ujemną lub większą od 4, wygenerowany zostanie wyjątek ArrayIndexOutOfBoundsException . Przechwytujemy go w bloku catch i wyświetlamy czytelną wiadomość dla użytkownika.

Do wczytania danych wykorzystaliśmy najprostszy sposób z wykorzystaniem klasy Scanner.

arrayindexoutofboundsexception try catch

Komentarze