– 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 |
---|
|
|
|
– 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:
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:
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:
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ę.
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
method1();
}
public static void method3() throws ClassNotFoundException
{
try
{
method1();
}
catch (FileNotFoundException e)
{
System.out.println("Obsłużono wyjątek FileNotFoundException.");
}
}
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.");
}
}
– 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.
GO TO FULL VERSION