


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
{
код, который нужно выполнить в любом случае
}