При разработке на Java один блок кода может выбрасывать разные типы ошибок. Для их обработки используется конструкция с множественными блоками catch.
Важное правило: блоки catch должны располагаться от более конкретных к более общим классам исключений. Если поставить перехват общего Exception первым, он перехватит всё, и код последующих блоков конкретных ошибок станет недостижимым (unreachable code), что вызовет ошибку компиляции.
В этом уроке мы научимся правильно выстраивать иерархию обработки исключений.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Блок try-catch.
- Множественные блоки catch.
- Блок finally.
- Выброс исключения (throw).
- Проброс исключения (throws).
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Иерархия исключений
Перед вами строки java-кода, содержащие блоки обработки исключений try-catch. Они перемешаны. Расставьте строки в правильном порядке, чтобы получился корректный код, обрабатывающий исключения. Учтите иерархию исключений: более специализированные исключения должны обрабатываться раньше, чем более общие. В данном примере ArithmeticException является подклассом RuntimeException, а RuntimeException — подклассом Exception.
try { int result = 10 / 0;} System.out.println("RuntimeException caught");} catch (ArithmeticException e) {} catch (RuntimeException e) { System.out.println("ArithmeticException caught"); System.out.println("Exception caught");2. Выбор типа исключения
В данном задании представлен фрагмент кода на Java, в котором выполняются операции, потенциально приводящие к исключениям: деление на ноль и обращение к элементу массива по несуществующему индексу. В блоках catch пропущены типы исключений. Ваша задача — для каждого пропуска выбрать из выпадающего списка подходящий тип исключения, который будет корректно перехватывать соответствующую ошибку. Обратите внимание на стандартные исключения Java, возникающие при арифметических ошибках и работе с массивами.
public class Main {
public static void main(String[] args) {
try {
int result = 10 / 0;
} catch (input1S e) {
System.out.println("Произошла арифметическая ошибка: деление на ноль.");
}
try {
int[] array = new int[5];
int value = array[10];
} catch (input2S e) {
System.out.println("Произошла ошибка при работе с массивом: выход за границы.");
}
}
}3. Какой блок сработает?
Проанализируйте приведённый ниже код на Java с блоком try-catch, содержащим несколько обработчиков исключений. Определите, какой именно блок catch будет выполнен при возникновении исключения в блоке try. Обратите внимание на иерархию классов исключений и порядок следования блоков catch.
public class Main {
public static void main(String[] args) {
try {
String str = null;
System.out.println(str.length());
} catch (ArithmeticException e) {
System.out.println("Перехвачено ArithmeticException");
} catch (NullPointerException e) {
System.out.println("Перехвачено NullPointerException");
} catch (Exception e) {
System.out.println("Перехвачено общее Exception");
}
}
}4. Unreachable code
В данном фрагменте кода на Java нарушен порядок обработки исключений в конструкции try-catch. Из-за этого один из блоков catch становится недостижимым, что приведет к ошибке компиляции. Найдите строки, содержащие объявления блоков catch, и исправьте типы исключений в них так, чтобы более специфичные исключения обрабатывались раньше общих, а код стал компилируемым.
public class Main { public static void main(String[] args) { try { int result = 10 / 0; } catch (Exception e) { System.out.println("Произошло общее исключение"); } catch (ArithmeticException e) { System.out.println("Деление на ноль"); } }}5. Сборка конструкции
Из предложенных строк соберите корректную java-программу, которая демонстрирует обработку исключений с помощью try-catch. Программа должна содержать блок try, в котором выполняется деление на ноль, и два блока catch: первый для обработки ArithmeticException, второй для обработки Exception (как более общего типа). Лишние строки (дополнительные catch блоки или блок finally) в решение включать не нужно.
public class Main { public static void main(String[] args) { try { int a = 10 / 0; } catch (ArithmeticException e) { System.out.println("Деление на ноль"); } catch (Exception e) { System.out.println("Другое исключение"); } }} catch (NullPointerException e) { System.out.println("Null pointer"); } finally { System.out.println("Finally block"); } } catch (IOException e) { System.out.println("IO error"); }6. Переменная исключения
Внимательно изучите приведённый фрагмент кода на Java, содержащий конструкцию try-catch для обработки исключений. Ваша задача — найти и выделить кликом все места внутри блоков catch, где используется объект исключения (например, для вызова его методов, таких как getMessage() или printStackTrace(), или для передачи в другие методы). Не отмечайте сами ключевые слова catch, объявления переменных исключений в скобках, а также строки кода, где объект исключения не используется.
try {
FileInputStream file = new FileInputStream("data.txt");
int data = file.read();
file.close();
} catch (FileNotFoundException e) {
System.out.println("Файл не найден: " + {{e.getMessage()~|~t1}});
{{e.printStackTrace()~|~t2}};
} catch (IOException ex) {
System.err.println("Ошибка ввода-вывода");
logError({{ex~|~t3}});
} catch (Exception generalException) {
System.out.println("Общая ошибка");
} finally {
System.out.println("Завершение обработки");
}7. Синтаксис блока
В этом фрагменте кода на Java используется конструкция try-catch для обработки исключений. В коде пропущены ключевые слова и скобки, необходимые для корректного синтаксиса блоков catch. Восстановите пропущенные элементы так, чтобы код компилировался и мог обрабатывать исключения типа ArithmeticException и ArrayIndexOutOfBoundsException. Обратите внимание на порядок блоков catch и правильное использование скобок.
public class MultipleCatchExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
int result = 0;
try {
result = numbers[5] / 0;
} input1S (ArithmeticException e) {
System.out.println("Деление на ноль: " + e.getMessage());
} input2S (ArrayIndexOutOfBoundsException e) {
System.out.println("Выход за границы массива: " + e.getMessage());
}
}
}