Искусственное генерирование исключений
Как уже отмечалось, исключения можно генерировать «вручную», то есть создавать видимость ошибки там, где ее и в помине нет. Для генерирования исключения используется ключевое слово throw. Команда генерирования исключения имеет следующий синтаксис:
throw объект_исключения;
После инструкции throw необходимо указать объект исключения, то есть объект, описывающий создаваемую исключительную ситуацию. Причем предварительно этот объект нужно создать. Напомним, что объект исключения — это объект класса Throwable или его подкласса. Существует два способа создания объекта исключения. Во-первых, можно воспользоваться аргументом блока catch, во-вторых, можно создать новый объект с помощью оператора new. При этом прибегают к помощи конструктора класса соответствующего исключения. Все исключения времени выполнения программы (класса RuntimeException) имеют конструкторы без аргументов и с текстовым аргументом. В последнем случае текст, переданный конструктору при создании объекта, отображается затем при описании объекта, если последний приводится к текстовому формату (например, при передаче объекта методам print() и println()).
После выполнения оператора throw поток выполнения останавливается, и следующая команда не выполнятся. Вместо этого начинается поиск подходящего для обработки сгенерированного исключения блока catch. Если такой блок не обнаруживается, используется обработчик по умолчанию. Пример программы с явным выбрасыванием исключения приведен в листинге 7.
Листинг 7.Явное выбрасывание исключения
class ThrowDemo{
static void demoproc(){
try{
// Создание объекта исключения:
NullPointerException ExObj=new NullPointerException("Ошибка!");
throw ExObj; // выбрасывание исключения
}catch(NullPointerException e){
System.out.println("Перехват исключения в методе demoproc!");
throw e; // повторное выбрасывание исключения
}}
public static void main(String args[]){
try{
demoproc();
}catch(NullPointerException e){
System.out.println("Повторный перехват: "+e);}
System.out.println("Работа программы завершена!");}
}
Результат выполнения программы такой:
Перехват исключения в методе demoproc!
Повторный перехват: java.lang.NullPointerException: Ошибка!
Работа программы завершена!
В классе ThrowDemo, помимо главного методапрограммы main(), описывается метод demoproc(), в котором явно выбрасывается исключение. Для начала создается объект исключения командой:
NullPointerException ExObj= new NullPointerException("Ошибка!")
Точнее, это объект ExObj класса NullPointerException (ошибка операций с указателем). Имеется конструктор класса NullPointerException с текстовым аргументом "Ошибка!". Этот текст впоследствии используется при выводе на экран описания возникшей ошибки. Командой throw ExObj производится выбрасывание исключения. Поскольку все это происходит в блоке try, то начинается поиск подходящего блока catch для обработки исключения. В данном случае блок catch всего один, и это именно тот блок, который нужен. В этом блоке выводится сообщение о том, что исключение перехвачено в методе demoproc(). Делается это командой
System.out.println("Перехват исключения в методе demoproc!")
Однако затем командой throw e снова выбрасывается исключение. Для того чтобы обработать это исключение, нужен внешний блок try с соответствующим блоком catch для обработки исключения. Поскольку в главном методе программы метод demoproc() вызывается в блоке try и для исключения класса NullPointerException описан обработчик (выполняется команда System.out.println("Повторный перехват: "+e)), то выброшенное из метода demoproc() исключение перехватывается и обрабатывается.
Хочется обратить внимание на два немаловажных момента. Во-первых, вместо явного создания в методе demoproc() объекта исключения ExObj можно было ограничиться анонимным объектом, объединив команды создания объекта исключения и его выбрасывания в одну команду вида:
throw new NullPointerException("Ошибка!")
Обычно так и поступают, поскольку это экономит место и время, а результат в принципе тот же. Во-вторых, сообщение программы Повторный перехват: java.lang.NullPointerException: Ошибка! возникает в результате обработки повторно выброшенного исключения вне метода demoproc(), в то время как объект исключения с текстовым параметром Ошибка! создавался в этом методе. Последовательность действий, которые приводят к такому результату, следующая.
При выбрасывании исключения в методе demoproc() объект исключения (то есть объект ExObj) передается аргументом в блок catch. Аргумент в этом блоке обозначен как e, но это формальное название аргумента. Такие же формальные названия для аргументов используются при описании методов. Реально в блок передается объект ExObj. Далее в блоке catch есть команда throw e, которая означает выброс исключения, переданного аргументом в блок catch. То есть это опять объект ExObj. Поскольку это второе исключение в методе demoproc() не обрабатывается, а передается во внешний блок try для перехвата и далее в соответствующий блок catch для обработки, то аргумент внешнего блока catch — это все тот же метод ExObj, который создавался конструктором с текстовым аргументом Ошибка!. Именно это описание ошибки и появляется на экране после передачи аргументом методу println() объекта исключения. Кроме этого описания автоматически отображается трасса стека ошибки (сообщение java.lang. NullPointerException:).
Дата добавления: 2016-06-22; просмотров: 1661;