Typy wyjątków - 1

– Chciałbym dzisiaj opowiedzieć Ci o jeszcze jednej rzeczy. W Javie wyjątki dzielą się na dwa typy: checked i unchecked, tj. wyjątki, które muszą być obsługiwane i wyjątki, których nie trzeba obsługiwać. Domyślnie wszystkie wyjątki powinny być obsługiwane.

– Potrafisz sam, intencjonalnie zwracać wyjątki w swoim kodzie?

– W swoim kodzie możesz zwrócić każdy wyjątek. Możesz nawet napisać swoje własne wyjątki. Ale o tym porozmawiamy później. W tej chwili skoncentrujmy się na wyjątkach wyrzucanych przez Maszynę Java.

– OK.

– Jeśli w metodzie są zwracane (pojawiają się) ClassNotFoundException lub FileNotFoundException, programista musi wskazać je w deklaracji metody. To są wyjątki typu checked. Wygląda to zazwyczaj tak:

Przykłady wyjątków typu checked
public static void method1() throws ClassNotFoundException, FileNotFoundException
public static void main() throws IOException
public static void main() // Nie wyrzuca żadnych wyjątków

– Po prostu piszemy „throws”, a następnie listę wyjątków oddzielonych przecinkami, zgadza się?

– Tak. Ale jest coś jeszcze. Aby program się kompilował, metoda, która wywołuje method1 w poniższym przykładzie, musi robić jedną z dwóch rzeczy: obsługiwać te wyjątki albo wyrzucać je ponownie (do wywołującego obiektu), wskazując wyrzucone ponownie wyjątki w jej deklaracji.

– Idźmy dalej. Jeśli Twoja metoda main ma wywoływać metodę, której deklaracja zawiera „throws FileNotFoundException, …”, musisz zrobić jedną z dwóch rzeczy:

1) Obsłużyć FileNotFoundException, …

Musisz zawinąć kod wywołujący podejrzaną metodę w blok try-catch.

2) Nie obsługiwać FileNotFoundException, …

Musisz dodać te wyjątki do listy wyrzucanych wyjątków w Twojej metodzie main.

– Możesz dać mi jakiś przykład?

– Spójrz na to:

Przykłady wyjątków typu checked
public static void main(String[] args)
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Wyrzuca FileNotFoundException jeśli dany plik nie istnieje
    FileInputStream strumWejscPliku = new FileInputStream("C2:\niepoprawnaNazwaPliku.txt");
}

– Kod w tym przykładzie nie będzie się kompilował, ponieważ metoda main wywołuje method1(), co wyrzuca wyjątki, które muszą zostać obsłużone.

– Aby kod się kompilował, musimy dodać do metody main obsługę wyjątków. Można to zrobić na dwa sposoby:

Opcja 1: Po prostu wyrzucamy wyjątek ponownie (do wywołującej metody):
public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Wyrzuca FileNotFoundException jeśli dany plik nie istnieje
    FileInputStream strumWejscPliku = new FileInputStream("C2:\niepoprawnaNazwaPliku.txt");
}

– A tutaj obsługujemy go za pomocą try-catch:

Opcja 2: Obsłuż wyjątek:
public static void main(String[] args)
{
    try
    {
        method1();
    }
    catch(Exception e)
    {
    }
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Wyrzuca FileNotFoundException jeśli dany plik nie istnieje
    FileInputStream strumWejscPliku = new FileInputStream("C2:\niepoprawnaNazwaPliku.txt");
}

– Zaczynam rozumieć.

– Spójrz na poniższy przykład. Dzięki niemu zrozumiesz całą resztę.

Zamiast obsługiwać wyjątki wyrzucamy je ponownie, w dół stosu wywołań, który wie, jak je obsłużyć:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Obsłuż jeden wyjątek i wyrzuć inny:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("Obsłużono wyjątek FileNotFoundException.");
    }
}
Obsługa obu wyjątków bez wyrzucania żadnego:
public static void method4()
{
    try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("Obsłużono wyjątek FileNotFoundException.");
    }
    catch (ClassNotFoundException e)
    {
        System.out.println("Obsłużono wyjątek ClassNotFoundException.");
    }
}
3
Zadanie
Składnia Java,  poziom 9lekcja 4
Niedostępne
Wprowadzanie kodu
Nie musisz myśleć, po prostu go wyklep! Brzmi to trochę paradoksalnie, ale czasami Twoje palce „pamiętają” kod lepiej niż Twój świadomy umysł. Właśnie dlatego trening w tajnym centrum CodeGym zawiera zadania wymagające wprowadzania kodu. Wprowadzając kod, przyzwyczajasz się do składni oraz zarabiasz ciemną materię. Co więcej, walczysz z własnym lenistwem!

– Jest jeszcze jeden typ wyjątku: RuntimeException i klasy, które po nim dziedziczą. Nie musisz ich obsługiwać. Są one wyjątkami typu unchecked. Mówi się, że trudno je przewidzieć. Możesz sobie z nimi poradzić w taki sam sposób, ale nie musisz ich wskazywać w klauzuli throws.