Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Использование try и catch. Множественные операторы catch




Использование try и catch

Хотя обработчик исключений по умолчанию, который предоставляет система времени выполнения Java, удобен для отладки, обычно вы захотите обрабатывать исключения самостоятельно. Это дает два существенных преимущества. Во-первых, вы получаете возможность исправить ошибку. Во-вторых, предотвращается автоматическое прерывание выполнения программы. Большинство пользователей будут недовольны (и это как минимум), если ваша программа будет останавливаться и распечатывать трассировку стека всякий раз при возникновении ошибки. К счастью, предотвратить это достаточно просто.

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

class Exc2 {

public static void main(String args[]) {

int d, a;

try { // Мониторинг блока кода.

d = 0;

a = 42 / d;

System. out. println(" Это не будет напечатано. " );

} catch (ArithmeticException e) { // перехват ошибки деления на ноль

System. out. println(" Деление на ноль. " );

}

System. out. println(" После оператора catch. " );

}}

Эта программа создает следующий вывод:

Деление на ноль.

После оператора catch.

Обратите внимание, что вызов println() внутри блока try никогда не будет выполняться. Как только исключение возбуждено, управление передается из блока try в блок catch. То есть строка “Это не будет напечатано” не отображается. После того, как блок catch будет выполнен, управление передается на строку программы, следующую за всем механизмом try/catch.

Операторы try и catch составляют единый узел. Область действия catch не распространяется на те операторы, которые идут перед оператором try. Оператор catch не может перехватить исключение, возбужденное другим оператором try (кроме случаев вложенных конструкций try, которые будут описаны ниже). Операторы, которые защищены блоком try, должны быть заключены в фигурные скобки (т. е. они должны находиться внутри блока). Вы не можете применить try к отдельному оператору программы.

Целью правильно построенных операторов catch является разрешение исключительных ситуаций и продолжение работы, как если бы ошибки вообще не случались.

Например, в следующей программе каждая итерация цикла for получает два случайных числа. Эти два числа делятся одно на другое, а результат используется для деления значения 12345. Окончательный результат помещается в a. Если какая-либо из операций деления вызывает ошибку деления на ноль, эта ошибка перехватывается, значение a устанавливается равным 0 и выполнение программы продолжается.

// Обработка исключения с продолжением работы.

import java. util. Random;

class HandleError {

BookNew_JAVA-7. indb 238 02. 06. 2007 1: 06: 58

Глава 10. Обработка исключений 239

public static void main(String args[]) {

int a=0, b=0, c=0;

Random r = new Random();

for(int i=0; i< 32000; i++) {

try {

b = r. nextInt();

c = r. nextInt();

a = 12345 / (b/c);

} catch (ArithmeticException e) {

System. out. println(" Деление на ноль. " );

a = 0; // присвоить ноль и продолжить работу

}

System. out. println(" a: " + a);

}

}}

Множественные операторы catch

В некоторых случаях один фрагмент кода может инициировать более одного исключения. Чтобы справиться с такой ситуацией, вы можете специфицировать два или более операторов catch, каждый для перехвата своего типа исключений. Когда возбуждается исключение, каждый оператор catch проверяется по порядку, и первый из них, чей тип соответствует исключению, выполняется. После того, как выполнится один из операторов catch, все остальные пропускаются, и выполнение программы продолжается с места, следующего за блоком try/catch. В следующем примере кода перехватываются два разных типа исключений.

// Демонстрация применения множественных операторов catch.

class MultiCatch {

public static void main(String args[]) {

try {

int a = args. length;

System. out. println(" a = " + a);

BookNew_JAVA-7. indb 239 02. 06. 2007 1: 06: 58

240 Часть I. Язык Java

int b = 42 / a;

int c[] = { 1 };

c[42] = 99;

} catch(ArithmeticException e) {

System. out. println(" Деление на 0: " + e);

} catch(ArrayIndexOutOfBoundsException e) {

System. out. println(" Ошибка индекса массива: " + e);

}

System. out. println(" После блока try/catch. " );

}}

Эта программа вызовет исключение деления на ноль, если будет запущена без аргументов командной строки, поскольку в этом случае a будет равно 0. Она выполнит деление, если будут передан аргумент командной строки, устанавливающий a равным значению больше нуля. Но в этом случае будет сгенерировано исключение ArrayIndexOutOfBoundsException, так как длина массива целых чисел c равна 1, в то время как программа пытается присвоить значение элементу массива c[42].

Когда используются множественные операторы catch, важно помнить, что подклассы исключений должны следовать перед любыми их суперклассами. Это потому, что оператор catch, который использует суперкласс, будет перехватывать все исключения этого суперкласса плюс всех его подклассов. То есть подкласс исключения никогда не будет обработан, если вы попытаетесь его перехватить после его суперкласса. Более того, в Java недостижимый код является ошибкой. Например, рассмотрим следующую программу:

/* Эта программа содержит ошибку.

Подкласс должен идти перед его суперклассом в

последовательности операторов catch. В противном случае

будет создан недоступный код, что приведет к ошибке при компиляции.

*/

class SuperSubCatch {

public static void main(String args[]) {

try {

int a = 0;

int b = 42 / a;

} catch(Exception e) {

System. out. println(" Общий перехват Exception. " );

}

/* Этот catch никогда не будет достигнут, потому что

ArithmeticException – это подкласс Exception. */

catch(ArithmeticException e) { // Ошибка – недостижимый код

System. out. println(" Это никогда не выполнится. " );

}

}}

Если вы попытаетесь скомпилировать эту программу, то получите сообщение об ошибке, говорящее о том, что второй оператор catch недостижим, потому что исключение уже перехвачено. Поскольку ArithmeticException – подкласс Exception, первый оператор catch обработает все ошибки, основанные на Exception, включая ArithmeticException. Это означает, что второй оператор catch не будет никогда выполнен. Чтобы исправить эту проблему, потребуется изменить порядок следования операторов catch.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...