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

Вложенные операторы try. throws




Вложенные операторы try

Операторы try могут быть вложенными. То есть оператор try может находиться внутри блока другого try. Всякий раз, когда управление попадает в блок try, контекст этого исключения заталкивается в стек. Если вложенный оператор try не имеет обработчика catch для определенного исключения, стек “раскручивается” и проверяются на соответствие обработчики catch следующего (внешнего) блока try. Это продолжается до тех пор, пока не будет найден подходящий оператор catch либо пока не будут проверены все уровни вложенных try. Если подходящий оператор catch не будет найден, то исключение обработает система времени выполнения Java. Ниже приведен пример, в котором используются вложенные операторы try.

// Пример вложенных операторов try.

class NestTry {

public static void main(String args[]) {

try {

int a = args. length;

/* Если не указаны параметры командной строки,

следующий оператор сгенерирует

исключение деления на ноль. */

int b = 42 / a;

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

try { // вложенный блок try

/* Если используется один аргумент командной строки,

то исключение деления на ноль

будет сгенерировано следующим кодом. */

if(a==1) a = a/(a-a); // деление на ноль

/* Если используется два аргумента командной строки,

то генерируется исключение выхода за пределы массива. */

if(a==2) {

int c[] = { 1 };

c[42] = 99; // генерируется исключение выхода за пределы массива

}

} catch(ArrayIndexOutOfBoundsException e) {

System. out. println(" Индекс за пределами массива: " + e);

}

} catch(ArithmeticException e) {

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

}

}}

throw

До сих пор мы перехватывали только исключения, которые возбуждала система времени выполнения Java. Однако существует возможность возбуждать исключения из ваших программ явным образом, используя оператор throw. Его общая форма показана ниже:

throw экземпляр_Throwable;

Здесь экземпляр_Throwable должен быть объектом типа Throwable либо подклассом Throwable. Примитивные типы – такие, как int или char, как и классы, отличные от Throwable, например String и Object, не могут быть использованы для исключений.

Существуют два способа получить объект Throwable: с использованием параметра в операторе catch либо созданием объекта оператором new. Поток выполнения останавливается непосредственно после оператора throw – любые последующие операторы не выполняются. Обнаруживается ближайший закрытый блок try, имеющий оператор catch соответствующего исключению типа. Если соответствие найдено, управление передается этому оператору. Если же нет, проверяется следующий внешний блок try и т. д. Если не находится подходящего по типу оператора catch, то обработчик исключений по умолчанию прерывает программу и печатает трассировку стека.

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

// Демонстрация применения throw.

class ThrowDemo {

static void demoproc() {

try {

throw new NullPointerException(" demo" );

} catch(NullPointerException e) {

System. out. println(" Перехвачено внутри demoproc. " );

throw e; // повторно возбудить исключение

}

}

public static void main(String args[]) {

try {

demoproc();

} catch(NullPointerException e) {

System. out. println(" Повторный перехват: " + e);

}

}}

Эта программа получает два шанса обработки одной и той же ошибки. Во-первых, main() устанавливает контекст исключения, затем вызывает demoproc(). Метод demoproc() устанавливает другой контекст обработки исключения и немедленно возбуждает новый экземпляр исключения NullPointerException, который перехватывается в следующей строке. Затем исключение возбуждается повторно. Ниже показан результирующий вывод.

Перехвачено внутри demoproc.

Повторный перехват: java. lang. NullPointerException: demo

Эта программа также демонстрирует, как создавать собственные объекты стандартных исключений Java. Обратите внимание на строку:

throw new NullPointerException(" demo" );

Здесь операция new используется для конструирования экземпляра NullPointerException. Многие их встроенных исключений времени выполнения Java имеют, по меньшей мере, два конструктора: один без параметров и один со строковым параметром.

Когда применяется вторая форма, аргумент указывает строку, описывающую исключение. Эта строка отображается, когда объект используется в качестве аргумента print() или println(). Она также может быть получена вызовом метода getMessage(), который определен в Throwable.

throws

Если метод может породить исключение, которое он сам не обрабатывает, он должен специфицировать это поведение так, чтобы вызывающий его код мог позаботиться об этом исключении. Это делается добавлением к объявлению метода конструкции throws.

Конструкция throws перечисляет типы исключений, которые метод может возбуждать. Это необходимо для всех исключений, кроме имеющих тип Error, RuntimeException либо их подклассов. Все остальные исключения, которые может возбуждать метод, должны быть объявлены в конструкции throws. Если этого не сделать, получится ошибка во время компиляции.

Вот общая форма объявления метода, которая включает оператор throws:

тип имя_метода(список_параметров) throws список_исключений

{

// тело метода

}   

Здесь список_исключений – это разделенный запятыми список исключений, которые метод может возбуждать.

Поделиться:





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



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