- 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:”
try
{
…
}
catch (IOException ex)
{
logger.log(ex);
throw ex;
}
catch (SQLException ex)
{
logger.log(ex);
throw ex;
}
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:"
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 |
---|---|
|
0 |
|
RuntimeException |
|
0 |
|
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(); ”.
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ć”.
GO TO FULL VERSION