Искусственное генерирование исключений


Как уже отмечалось, исключения можно генерировать «вручную», то есть создавать видимость ошибки там, где ее и в помине нет. Для генерирования исключения используется ключевое слово 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; просмотров: 1571;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.