5.4 Ключевое слово finally (часть 2)

В вышеупомянутом коде, метод staticMethod () определен, чтобы отобразить длину строки 's'. Так как никакая строка не назначена переменной 's' функциональный запрос производит исключение.

Мы можем видеть, что письмо В никогда не печатается, потому что управление никогда не достигается этой записи кода. Когда в методе происходит исключение, управление методом main () передаётся блоку catch и затем на блок finally. В результате, остальная часть утверждений в блоке try никогда не выполняется.

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

В Java, может быть реализовано многократное использование блоков 'catch ()' для того, чтобы обрабатывать различные типы исключений отдельно. Пример дан в фрагменте кода ниже.
.      .       .
try {
doFileProcessing(); //user defined method
display-Results () ; // user defined method
}
catch(LookupException le) { // le - LookupException object
handleLookupException(e); // user defined handler
}
catch(Exception e) { // e - Exception object
System.err.println( Error: + e.printStackTrace());

}
.      .       .

Так как первый блок catch предназначен, чтобы заманить в ловушку LookupException, если бы такое исключение происходило, тогда оно бы обрабатывалось непосредственно этим блоком. Если же исключение не имеет тип LookupException, то управление передаётся второму блоку catch, который предназначен для того, чтобы заманить в ловушку любое исключение.

В этом случае, 'LookupException' было бы поймано и обработано первым блоком 'catch', а любой другой тип исключения будет обработан вторым блоком 'catch'.

LookupException является подклассом класса Exception и обрабатывается перед исключением в блоке catch. Тонкость в том, что, если бы сначала обрабатывался Exception, то управление никогда не достигало бы второго блока catch.

Пример 4 показывает, как использовать многократные блоки catch.

Пример 4:
class Catch22 {
public static void main(String args []) {
try {
String num=args[0] ;
int numValue=Integer.parseInt(num);
System.out.println( The square is +numValue*numValue);
           }
catch(ArraylndexOutOfBoundsException ne) {
System.out.println( No arguments given! );
           }
           catch(NumberFormatException nb) {
           System.out.println( Not a number! );
           }
           }
     }

Вывод представлен на рисунке 5.6


Рисунок 5.6: Вывод примера 4

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

Рассмотрим фрагмент кода ниже:
.      .       .
try {
statement 1;
statement 2;

try {
statement1;
statement1;
}
catch(Exception e) { // of the inner try block
             .     .

}
}
catch(Exception e) { // of the outer try block
             .     .
}

Когда используются вложенные блоки 'try', сначала выполняется внутренний блок 'try'. Любое добавленное исключение перехватывается внутренним блоком 'try' в соответствующих блоках 'catch'. Если соответствующий блок 'catch' не найден, то осматриваются 'catch' блоки внешних 'try' блоков. Если никакие блоки соответствия не найдены, то Java Runtime Environment обрабатывает исключение.

Обратите внимание: Когда блоки 'try' используются без блоков 'catch', программа компилируется без каких-либо проблем, но заканчивается в течение времени выполнения. Это происходит потому, что исключение выбрасывается во время выполнения.

назад к оглавлению вперед

Rus. Open Source company, г. Саратов
ул. Орджоникидзе, 156, офис 203
тел: 8 (8452) 57-84-41
e-mail: info@rus_opensource.com

Главная | Обзоры | О разном
Карта сайта

Учебная литература:

Введение в Linux
Основы JAVA
Архивы

© 2013 opensourcerules.net