Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Java.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
3.45 Mб
Скачать

Тема 4.4 Ключевые слова try и catch

Для задания блока программного кода, который требуется защитить от исключений, исполь­зуется ключевое слово try. Сразу же после try-блока помещается блок catch, задающий тип исключения которое вы хотите обрабатывать. 

Листинг 4.3 

public class Main {

public static void main(String[] args) {

try {

int x = 10 / 0;

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

} catch (ArithmeticException e) {

System.out.println("Ошибка! Деление на ноль!");

}

}

}

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

Целью большинства хорошо сконструированных catch-разделов долж­на быть обработка возникшей исключительной ситуации и приведение переменных программы в некоторое разумное состояние – такое, чтобы программу можно было продолжить так, будто никакой ошибки и не было (в нашем примере выводится предупреждение – Ошибка! Деление на ноль!). 

Задание:

Написать метод деления двух чисел, учесть обработку в случае деления на ноль.

В некоторых случаях один и тот же блок программного кода может воз­буждать исключения различных типов. Для того, чтобы обрабатывать по­добные ситуации, Java позволяет использовать любое количество catch-разделов для try-блока. Наиболее специализированные классы исключений должны идти первыми, поскольку ни один подкласс не будет достигнут, если поставить его после суперкласса. Следующая про­грамма перехватывает два различных типа исключений, причем за этими двумя специализированными обработчиками следует раздел catch общего назначения, перехватывающий все подклассы класса Throwable.

Листинг 4.4

public class Main {

public static void main(String[] args) {

try {

int a = args.length;

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

int b = 42 / a;

int c[] = {1};

c[42] = 99;

} catch (ArithmeticException e) {

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

} catch (ArrayIndexOutOfBoundsException e) {

System.out.println("Выход за пределы массива " + e);

} catch (Throwable e) {

//исключения всех остальных типов попадают сюда

System.out.println("Ошибка " + e);

}

}

Этот пример, запущенный без параметров, вызывает возбуждение ис­ключительной ситуации деления на нуль. Если же мы зададим в командной строке один или несколько параметров, тем самым установив а в значение боль­ше нуля, наш пример переживет оператор деления, но в следующем опе­раторе будет возбуждено исключение выхода индекса за границы масси­ва ArrayIndexOutOf Bounds. Ниже приведены результаты работы этой программы, за­пущенной и тем и другим способом.

a = 0

Деление на ноль java.lang.ArithmeticException: / by zero

a = 1

Выход за пределы массива java.lang.ArrayIndexOutOfBoundsException: 42 

В случае, если произойдет ошибка какого-либо другого типа, то она будет перехвачена последним блоком catch (Throwable e).

Задание:

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

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

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

Листинг 4.5

public class Main {

public static void metod() {

try {

int c[] = {1};

c[42] = 99;

} catch (ArrayIndexOutOfBoundsException e) {

System.out.println("Выход за пределы массива " + e);

}

}

public static void main(String[] args) {

try {

int a = args.length;

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

int b = 42 / a;

metod();

} catch (ArithmeticException e) {

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

}

}

}

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

Блоки try могут быть вложены и в пределах одного метода.

Листинг 4.6

public class Main {

public static void main(String[] args) {

try {

int a = args.length;

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

int b = 42 / a;

try {

int c[] = {1};

c[42] = 99;

} catch (ArrayIndexOutOfBoundsException e) {

System.out.println("Выход за пределы массива " + e);

}

System.out.println("Окончание внешнего блока try");

} catch (ArithmeticException e) {

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

} catch (Throwable e) {

//исключения всех остальных типов попадают сюда

System.out.println("Ошибка " + e);

}

}

}

Если ошибка произойдет во внешнем блоке try, то попадаем в блок catch(ArithmeticException e) и программа останавливается. Если ошибка происходит во внутреннем блоке try, то она обрабатывается его блоком catch(ArrayIndexOutOfBoundsException e), но внешний блок все равно выполниться до конца.