— Ага. Вот ты где. Я уже тебя обыскалась.
— Что-то случилось?
— Нет, но мы же занимаемся.
— Ок. Я тебя слушаю.
— Я хочу тебе рассказать об исключениях еще пару фактов:
В Java 7 конструкция try-catch была немного расширена за счет добавления «множественных catch». Смотри пример:
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;
}
— Т.е. теперь можно писать несколько исключений через ИЛИ ( «|» — это бинарный ИЛИ)?
— Да, правда, удобно?
— Гм. А какой тип будет у этого объекта-исключения внутри блока catch?
Ведь у IOException могут быть свои методы, а у SQLException – свои.
— Тип исключения будет такой же, как и у их общего класса-предка.
— Ага. Т.е. скорее всего Exeption или RuntimeException. Почему тогда просто не написать catch(Exception e)?
— Иногда, когда программисты обрабатывают все ошибки отдельно, бывает удобно разбить их на группы и одни ошибки записать в лог, другие пробросить выше, третьи обработать иным способом.
Т.е. такая схема призвана решить проблему дублирования catch-блоков кода для обработки разных ошибок.
— Ага. Понято. Спасибо, Элли.
— Это еще не все, я хочу еще рассказать немного про блок finally.
Как ты уже, наверное, знаешь, этот блок выполняется всегда.
Когда я говорю всегда, я имеют ввиду абсолютно всегда.
Пример:
try
{
return 1;
}
finally
{
return 0;
}
Тут есть return в блоке try и return в блоке finally. Так вот, результатом вызова метода будет число 0.
Блок finally выполнится, что бы ни произошло. А его метод return перезатер старое возвращаемое значение своим значением.
— Ясно.
Более того, метод может либо вернуть значение, либо выбросить исключение.
Поэтому, если в блоке try возвращается значение, а в finally выбрасывается исключение, то в результате будет исключение.
— А если в блоке try выбрасывается исключение, а в блоке finally выполняется return?
Тогда считается, что метод корректно отработал и возвращается значение, которое было передано в return.
Пример | Результа |
---|---|
|
0 |
|
RuntimeException |
|
0 |
|
IOException |
Единственной причиной, по которой может не выполниться метод finally, может быть немедленное завершение программы посредством вызова метода System.exit();
try
{
System.exit(0);
return 1;
}
finally
{
return 0;
}
— Ясно.
— Учти, обычно на собеседованиях спрашивают все из этой темы, так что лучше тебе это и понять и запомнить.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ