Jak działa multi-catch - 1

– Mam dla Ciebie jeszcze kilka ciekawych lekcji. Oh, jak ja kocham nauczać!

– Chciałbym opowiedzieć Ci o tym, jak działa wiele bloków catch. Zasada jest bardzo prosta: kiedy w bloku try pojawi się wyjątek, wykonywanie przechodzi do pierwszego bloku catch.

– Jeśli typ wskazany w nawiasach bloku catch pasuje do typu wyrzuconego wyjątku, to wykonywanie zaczyna się wewnątrz bloku. W innym wypadku przechodzimy do następnego bloku catch, gdzie to samo sprawdzane jest raz jeszcze.

– Jeśli po ostatnim bloku catch wyjątek nie został jeszcze obsłużony, zostanie on wyrzucony ponownie i bieżąca metoda zakończy się nieprawidłowo.

– Rozumiem. Wykonany zostanie ten blok catch, który pokrywa się z typem wyjątku.

– Tak, racja. Jednak w rzeczywistości jest to trochę bardziej skomplikowane. Klasy mogą dziedziczyć po innych klasach. Jeśli klasa Krowa dziedziczy po klasie Zwierzeta, to do obiektu Krowa można się odnieść nie tylko przez zmienną Krowa, ale także przez zmienną Zwierzeta.

– I?

– Ponieważ wszystkie wyjątki dziedziczą po Exception lub RuntimeException (który także dziedziczy po Exception), to też mogą zostać obsłużone przy użyciu „catch (Exception e)” lub „catch (RuntimeException e)”.

– I?

– Możemy z tego wysnuć dwa wnioski. Po pierwsze, możesz użyć „catch (Exception e)”, aby obsłużyć każdy wyjątek. Po drugie, kolejność bloków catch ma znaczenie.

– Oto kilka przykładów:

ArithmeticException, który pojawia się po tym, jak dzielimy przez 0, zostanie obsłużony w drugim bloku catch.

Kod
try
{
    System.out.println("Przed wywołaniem method1.");
    int a = 1 / 0;
    System.out.println("Po wywołaniu method1. Ten komunikat nigdy nie zostanie wyświetlony.");
}
catch (NullPointerException e)
{
    System.out.println("Referencja null. Wyjątek został obsłużony.");
}
catch (ArithmeticException e)
{
    System.out.println("Dzielenie przez zero. Wyjątek został obsłużony.");
}
catch (Exception e)
{
    System.out.println("Jakiekolwiek inne błędy. Wyjątek został obsłużony.");
}

– W poniższym przykładzie ArithmeticException zostanie obsłużony w pierwszym bloku catch, ponieważ wszystkie wyjątki dziedziczą po Exception, tj. Exception obejmuje wszystkie wyjątki.

Kod
try
{
    System.out.println("Przed wywołaniem method1.");
    int a = 1/0;
    System.out.println("Po wywołaniu method1. Ten komunikat nigdy nie zostanie wyświetlony.");
}
catch (Exception e)
{
    System.out.println("Jakiekolwiek inne błędy. Wyjątek został obsłużony.");
}
catch (NullPointerException e)
{
    System.out.println("Referencja null. Wyjątek został obsłużony.");
}
catch (ArithmeticException e)
{
    System.out.println("Dzielenie przez zero. Wyjątek został obsłużony.");
}

– W poniższym przykładzie ArithmeticException nie zostanie obsłużony. Zostanie on wyrzucony ponownie do metody wywołującej.

Kod
try
{
    System.out.println("Przed wywołaniem method1.");
    int a = 1/0;
    System.out.println("Po wywołaniu method1. Ten komunikat nigdy nie zostanie wyświetlony.");
}
catch (NullPointerException e)
{
    System.out.println("Referencja null. Wyjątek został obsłużony.");
}

– To mi trochę rozjaśniło. Te wyjątki to nie jest najłatwiejszy temat.

– Tylko tak Ci się wydaje. Tak naprawdę są one jedną z najłatwiejszych rzeczy w Javie.

– Nie wiem, czy powinno mnie to cieszyć, czy martwić...