Главная » Java, Структуры данных и алгоритмы » Перехват исключений Java

0

После того как метод генерирует исключение, оно перехватывается, иначе выполнение программы прекращается. Метод, в котором возникла исключительная ситуация, может передать ее другому методу или перехватить ее сам. После перехвата такой ситуации проводится ее анализ и обработка. Общая методология обработки исключений состоит в том, что программа «пытается» выполнить некий фрагмент кода, который может порождать исключения. Если исключение действительно появляется, выполняется его перехват, то есть алгоритм выполнения переходит к заранее описанному блоку catch. После этого в блоке перехвата происходит обработка обстоятельств возникновения исключительной ситуации.

Блок try-catch записывается в Java следующим образом:

try

<block_of_statements_1 > catch (<exception_type> <identifier>)

<block_of_statements_2> [catch (<exception_type> <identifier>) <block_of_statements_3>]

[finally

<block_of_statements_n>]

Вначале среда Java выполняет <block_of_statements_l>. Если в ходе этого исключительные ситуации не возникают, алгоритм переходит к первой строке кода, следующего за блоком try-catch, если только этот блок не содержит дополнительного блока finally. Если существует блок finally, то он выполняется независимо от генерации/перехвата исключений. Таким образом, если исключения не генерируются, после блока try выполняется блок finally, а затем выполняется первая строка, следующая за блоком try.

С другой стороны, если в блоке <block_of_statements_l> возникает исключительная ситуация, выполнение блока try прекращается, и программа переходит к выполнению блока catch, соответствующего типу возникшей ситуации. <Identifier> в операторе перехвата обозначает объект-исключение, который вызывается в данном блоке catch. После выполнения блока catch алгоритм переходит к дополнительному блоку finally (при его наличии) или непосредственно к первой строке кода, следующего за блоком try-catch. Однако, если блок catch, соответствующий типу исключения, отсутствует, то алгоритм выполнения переходит к дополнительному блоку finally, после чего исключительная ситуация передается назад в метод.

Рассмотрим следующий фрагмент кода:

int index = lnteger.MAX_ VALUE; // 2,14 миллиарда

try   // Вероятно, данный код может вызвать проблемы

<    I

String toBuy = shoppingList[index]; >

}

catch (ArraylndexOutOfBoundsException aioobx)

{

System, out. printlnfThe index "+index+" is outside the array.");

}

Если исключительная ситуация не была перехвачена этим кодом, программа выходит из метода и возвращается к коду, вызвавшему данный метод. Далее исполняющая среда Java начнет поиск нового блока обработки ситуации, то есть при отсутствии в вызвавшем методе блока перехвата программа перейдет к коду, вызвавшему данный код, и так далее. В конечном счете, если исключение не будет перехвачено ни одним из кодов, исполняющая Java-среда (определяющая алгоритм выполнения нашей программы) сама перехватит исключение. После этого на консоль выводится сообщение об ошибке и стек операций, приведших к ошибке, а выполнение программы прекращается.

Ни^ке приводится реальное сообщение исполняющей среды об ошибке (надеемся, читателю не приходилось с ним сталкиваться):

java.lang.lMullPointerException: Returned a null locator at Java.awt.Component.handleEvent(Componentjava:900)

at Java awt. Component. postEvent(Component.java. 838) at Java. awt. Component. postEvent(Component.java:845) at sun.awt.motif. MButtonPeer.action(MButtonPeerjava:39) at Java.lang.Thread.run(Thread.java)

После того как исключение было перехвачено, у программиста имеется возможность выбора дальнейших действий — например, вывести сообщение об ошибке и прекратить выполнение программы. Но существует несколько случаев, при которых лучшим способом обработки исключения будет его игнорирование (это можно выполнить, если оставить блок catch пустым).

Игнорирование исключений происходит, например, в тех случаях, когда программиста не интересует возникновение исключений. Еще одним способом обработки исключительной ситуации является создание другого блока обработки исключения, по возможности более четко описывающего условия, приведшие к возникновению ситуации. Пример подобного подхода представлен ниже:

catch (ArraylndexOutOfBoundsException aioobx) { throw new ShoppingListTooSmallExcepti6n(

"Product index is not in the shopping list");

}

И все же наилучшим способом обработки исключительных ситуаций (хотя это и не всегда возможно) является обнаружение проблемы, ее устранение и непрерывное выполнение программы.

Источник: Гудрич М.Т. Г93 Структуры данных и алгоритмы в Java / М.Т. Гудрич, Р. Тамассия; Пер. с англ. A.M. Чернухо. — Мн.: Новое знание, 2003. — 671 е.: ил.

По теме:

  • Комментарии