1. Оператор throw
Исключение, пока оно не выброшено в систему, или когда оно уже перехвачено блоком catch — это в принципе просто объект класса, унаследованного от Exception (вернее, от Throwable). Никакими магическими особенностями сам объект-исключение не обладает.
Вся логика работы исключений — это просто особый сценарий поведения Java-машины, когда в ее среду выполнения вброшено исключение.
Вы всегда можете снова вбросить Java-машине исключение, которое только что перехватили. Для этого нужно использовать оператор throw:
throw исключение;
Пример:
| Код | Вывод на экран |
|---|---|
|
|
В этом коде мы перехватили исключение, вывели на экран надпись об этом и снова выбросили его.
Повторно выброшенное исключение не может быть захвачено другими блоками catch этого же try-блока.
2. Свое исключение
Кстати, вы можете сами создать объект-исключение: это просто объект типа Exception или унаследованного от него класса. И выбросить его.
Это проще, чем кажется. Пример:
| Код | Вывод на экран |
|---|---|
|
|
В примере выше мы создали новый объект-исключение типа RuntimeException и тут же выбросили его с помощью оператора throw.
Оно будет сразу захвачено блоком catch, т.к. тип RuntimeException унаследован от типа Exception. Код catch(Exception except) захватывает объекты-исключения всех классов, унаследованных от класса Exception.
3. Ключевое слово finally
Еще один важный момент. Иногда программисту нужно сделать некоторые действия независимо от того, было исключение в коде или нет. Например, в коде мы открыли файл на запись, а открытый файл нужно обязательно закрыть вызовом метода close().
try
{
код, где может возникнуть ошибка
}
catch(ТипИсключения имя)
{
код обработки исключения
}
finally
{
код, который нужно выполнить в любом случае
}
Для выполнения таких обязательных действий к оператору try-catch добавили еще один блок — finally, и получился оператор try-catch-finally. Выглядит это дело примерно так:
Пример:
FileInputStream source = null;
try
{
source = new FileInputStream("c:\\note.txt");
source.read();
}
catch(Exception except)
{
System.out.println("Перехватили исключение");
throw except;
}
finally
{
if (source != null)
source.close();
}
Код в блоке finally выполнится в любом случае независимо от того, было исключение или не было. Даже если исключение возникло, и оно не было перехвачено, блок finally все равно выполнится.
Кстати, если вы не хотите перехватывать исключение, а блок finally вам нужен, используйте сокращенную запись блока try-catch-finally — try-finally. Выглядит это примерно так:
try
{
код, где может возникнуть ошибка
}
finally
{
код, который нужно выполнить в любом случае
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ