Множественные блоки catch

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

При разработке на Java один блок кода может выбрасывать разные типы ошибок. Для их обработки используется конструкция с множественными блоками catch.

Важное правило: блоки catch должны располагаться от более конкретных к более общим классам исключений. Если поставить перехват общего Exception первым, он перехватит всё, и код последующих блоков конкретных ошибок станет недостижимым (unreachable code), что вызовет ошибку компиляции.

В этом уроке мы научимся правильно выстраивать иерархию обработки исключений.

Список тем

1. Иерархия исключений

id: 40499_catch_01_sequencing

Перед вами строки 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. Выбор типа исключения

id: 40499_catch_02_select

В данном задании представлен фрагмент кода на 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 сек.
Показать подсказку

3. Какой блок сработает?

id: 40499_catch_03_predict

Проанализируйте приведённый ниже код на 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

id: 40499_catch_04_error

В данном фрагменте кода на 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("Деление на ноль");
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Сборка конструкции

id: 40499_catch_05_build

Из предложенных строк соберите корректную 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"); }
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Переменная исключения

id: 40499_catch_06_click

Внимательно изучите приведённый фрагмент кода на 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. Синтаксис блока

id: 40499_catch_07_replace

В этом фрагменте кода на 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());
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру