- Ach. Tu jesteś. Szukałem cię.

"Czy coś się stało?"

„Nie, ale wciąż się uczymy”.

"OK. Słucham."

„Chcę powiedzieć ci jeszcze kilka rzeczy o wyjątkach:”

„W Javie 7 konstrukcja try-catch została nieco rozszerzona poprzez dodanie wielu bloków catch. Spójrz na ten przykład:”

Jawa 5
try
{}
 catch (IOException ex)
{
 logger.log(ex);
 throw ex;
}
 catch (SQLException ex)
{
 logger.log(ex);
 throw ex;
}
Jawa 7
try
{}
 catch (IOException | SQLException ex)
{
 logger.log(ex);
 throw ex;
}

„Czy teraz możemy napisać wiele wyjątków oddzielonych operatorami OR („|” to binarne OR)?”

„Zgadza się. Czy to nie wygodne?”

„Hmm. Ale jaki będzie typ obiektu wyjątku w bloku catch?”

„W końcu wyjątek IOException ma swoje metody, a wyjątek SQLException ma swoje metody”.

„Typem wyjątku będzie typ ich wspólnej klasy przodków”.

„Ach. Innymi słowy, najprawdopodobniej będzie to Exeption lub RuntimeException . Dlaczego więc nie napisać po prostu catch(Exception e)?”

„Czasami podczas obsługi błędów pojedynczo wygodnie jest je pogrupować, zapisując niektóre błędy w dzienniku, ponownie zgłaszając inne i obsługując inne w inny sposób”.

„Innymi słowy, ten schemat jest uznawany za rozwiązanie problemu zduplikowanych bloków catch do obsługi różnych błędów”.

– Ach. Rozumiem. Dzięki, Ellie.

„To nie wszystko. Chcę ci powiedzieć trochę więcej o ostatnim bloku”.

„Jak zapewne już wiesz, ten blok jest zawsze wykonywany”.

„A kiedy mówię zawsze, mam na myśli absolutnie zawsze ”.

"Na przykład:"

Przykład użycia w końcu
try
{
 return 1;
}
 finally
{
 return 0;
}

„Tutaj jest powrót w bloku try i powrót w bloku ostatecznie . Zatem wartością zwracaną przez tę metodę będzie liczba 0”.

„ Blok ultimate będzie wykonywany bez względu na to, co się stanie. A jego instrukcja return zastępuje drugą zwracaną wartość własną wartością”.

"Widzę."

„Jednak metoda może albo zwrócić wartość, albo zgłosić wyjątek ” .

„Tak więc, jeśli wartość zostanie zwrócona w bloku try, ale blok ostatecznie zgłasza wyjątek , wynikiem będzie wyjątek.

„Co się stanie, jeśli w bloku try zostanie zgłoszony wyjątek, ale blok ostatecznie ma instrukcję return?”

„Wtedy wygląda to tak, jakby metoda zadziałała poprawnie i została zwrócona wartość w instrukcji return.

Przykład Wynik
try
{
 return 1;
}
 finally
{
 return 0;
}
0
try
{
 return 1;
}
 finally
{
 throw new RuntimeException();
}
RuntimeException
try
{
 throw new RuntimeException();
}
 finally
{
 return 0;
}
0
try
{
 throw new RuntimeException();
}
 finally
{
 throw new IOException();
}
IOException

„Jedynym powodem, dla którego metoda ultimate mogłaby nie zostać wykonana, byłoby natychmiastowe zakończenie programu przez wywołanie metody System.exit(); ”.

Przykład
try
{
 System.exit(0);
 return 1;
}
 finally
{
 return 0;
}

"Widzę."

„Pamiętaj, że wszystkie te tematy są zwykle poruszane w wywiadach, więc dobrze byłoby je zrozumieć i zapamiętać”.