Обработка исключений в Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Мы рассмотрим следующие темы:

  1. Понимание, что такое исключения и почему они важны
  2. Использование блоков try-catch для обработки исключений
  3. Создание и выброс пользовательских исключений
  4. Использование блока finally для операций по очистке ресурсов
  5. Работа с несколькими блоками catch

По завершении этого лабораторного занятия вы сможете писать программы на Java, способные обрабатывать различные сценарии ошибок, что сделает ваш код более надежным и поддерживаемым.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/DataStructuresGroup -.-> java/arrays("Arrays") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/inheritance("Inheritance") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") subgraph Lab Skills java/arrays -.-> lab-413830{{"Обработка исключений в Java"}} java/classes_objects -.-> lab-413830{{"Обработка исключений в Java"}} java/inheritance -.-> lab-413830{{"Обработка исключений в Java"}} java/exceptions -.-> lab-413830{{"Обработка исключений в Java"}} end

Понимание исключений

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

  1. Откройте терминал и перейдите в каталог проекта:

    cd ~/project
  2. Откройте файл ExceptionDemo.java в текстовом редакторе. Вы должны увидеть следующую базовую структуру:

    public class ExceptionDemo {
        public static void main(String[] args) {
            // We'll add our code here in Step 1
        }
    }
  3. Давайте изменим этот файл, чтобы продемонстрировать исключение. Замените содержимое метода main следующим кодом:

    int[] numbers = {1, 2, 3};
    System.out.println("Attempting to access the fourth element of the array...");
    System.out.println(numbers[3]);
    System.out.println("This line won't be executed due to the exception.");

    Этот код создает массив из трех элементов и затем пытается получить доступ к четвертому элементу (которого не существует).

  4. Сохраните файл ExceptionDemo.java.

  5. Скомпилируйте и запустите программу:

    javac ExceptionDemo.java
    java ExceptionDemo

    Вы должны увидеть сообщение об ошибке, похожее на следующее:

    Attempting to access the fourth element of the array...
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
        at ExceptionDemo.main(ExceptionDemo.java:5)

Это пример исключения. Исключение ArrayIndexOutOfBoundsException выбрасывается, потому что мы пытаемся получить доступ к индексу массива, который не существует. Вместо того чтобы продолжать выполнение, программа останавливается и предоставляет информацию об ошибке.

Исключения - это способ Java обрабатывать ошибки и необычные ситуации. Они позволяют нам:

  • Определять и реагировать на ошибки в нашем коде
  • Разделять код обработки ошибок от обычного кода, что делает оба типа кода более понятными
  • Передавать информацию об ошибке вверх по стеку вызовов

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

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

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

  1. Снова откройте файл ExceptionDemo.java в текстовом редакторе.

  2. Замените содержимое метода main следующим кодом:

    int[] numbers = {1, 2, 3};
    
    try {
        System.out.println("Attempting to access the fourth element...");
        System.out.println(numbers[3]);
        System.out.println("This line won't be executed if an exception occurs.");
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Oops! An error occurred: " + e.getMessage());
        System.out.println("The array only has " + numbers.length + " elements.");
    }
    
    System.out.println("The program continues running after handling the exception.");

    Разберем этот код:

    • Блок try содержит код, который может выбросить исключение.
    • Блок catch указывает тип исключения, которое он может обработать (в данном случае ArrayIndexOutOfBoundsException), и предоставляет код, который будет выполнен, если это исключение возникнет.
    • Если в блоке try возникает исключение, выполнение сразу переходит в блок catch.
    • После выполнения блока catch программа продолжает выполнение со следующей строки после структуры try-catch.
  3. Сохраните файл ExceptionDemo.java.

  4. Скомпилируйте и запустите программу:

    javac ExceptionDemo.java
    java ExceptionDemo

    Вы должны увидеть вывод, похожий на следующий:

    Attempting to access the fourth element...
    Oops! An error occurred: Index 3 out of bounds for length 3
    The array only has 3 elements.
    The program continues running after handling the exception.

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

Создание и выброс пользовательских исключений

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

  1. Откройте файл CustomException.java в текстовом редакторе. Вы увидите, что он в настоящее время пуст.

  2. Добавьте следующий код для определения нашего пользовательского исключения:

    public class CustomException extends Exception {
        public CustomException(String message) {
            super(message);
        }
    }

    Это создаёт новый тип исключения с именем CustomException, который наследуется от встроенного класса Exception.

  3. Теперь откройте файл CustomExceptionDemo.java. Вы должны увидеть следующую базовую структуру:

    public class CustomExceptionDemo {
        public static void main(String[] args) {
            // We'll add our code here in Step 3
        }
    }
  4. Давайте изменим этот файл, чтобы использовать наше пользовательское исключение. Замените его содержимое следующим кодом:

    public class CustomExceptionDemo {
        public static void validateAge(int age) throws CustomException {
            if (age < 0) {
                throw new CustomException("Age cannot be negative");
            } else if (age > 120) {
                throw new CustomException("Age seems unrealistic");
            }
            System.out.println("Age is valid: " + age);
        }
    
        public static void main(String[] args) {
            try {
                System.out.println("Validating age 25:");
                validateAge(25);
                System.out.println("Validating age -5:");
                validateAge(-5);
            } catch (CustomException e) {
                System.out.println("CustomException caught: " + e.getMessage());
            }
    
            System.out.println("Program continues after exception handling");
        }
    }

    Этот код демонстрирует:

    • Как создать метод, который выбрасывает пользовательское исключение (validateAge)
    • Как выбросить исключение с использованием ключевого слова throw
    • Как поймать и обработать пользовательское исключение
  5. Сохраните оба файла: CustomException.java и CustomExceptionDemo.java.

  6. Скомпилируйте и запустите программу:

    javac CustomException.java CustomExceptionDemo.java
    java CustomExceptionDemo

    Вы должны увидеть вывод, похожий на следующий:

    Validating age 25:
    Age is valid: 25
    Validating age -5:
    CustomException caught: Age cannot be negative
    Program continues after exception handling

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

Использование блока finally

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

  1. Откройте файл FinallyDemo.java. Вы должны увидеть следующую базовую структуру:

    public class FinallyDemo {
        public static void main(String[] args) {
            // We'll add our code here in Step 4
        }
    }
  2. Замените содержимое метода main следующим кодом:

    try {
        System.out.println("Trying to divide by zero...");
        int result = 10 / 0;
        System.out.println("This line won't be executed.");
    } catch (ArithmeticException e) {
        System.out.println("Caught an exception: " + e.getMessage());
    } finally {
        System.out.println("This block always executes, regardless of exceptions.");
    }
    
    System.out.println("Program continues after the try-catch-finally block.");

    Этот код демонстрирует:

    • Блок try, в котором выполняется попытка деления на ноль (что вызовет исключение ArithmeticException)
    • Блок catch для обработки этого исключения
    • Блок finally, который будет выполнен независимо от того, возникло ли исключение или нет
  3. Сохраните файл FinallyDemo.java.

  4. Скомпилируйте и запустите программу:

    javac FinallyDemo.java
    java FinallyDemo

    Вы должны увидеть вывод, похожий на следующий:

    Trying to divide by zero...
    Caught an exception: / by zero
    This block always executes, regardless of exceptions.
    Program continues after the try-catch-finally block.

Блок finally полезен для операций по очистке ресурсов, которые должны выполняться независимо от того, было ли выброшено исключение или нет, например, для закрытия файлов или сетевых соединений.

Работа с несколькими блоками catch

Иногда в одном блоке кода могут возникать разные типы исключений. Java позволяет обрабатывать различные типы исключений с помощью нескольких блоков catch.

  1. Откройте файл MultipleCatchDemo.java. Вы должны увидеть следующую базовую структуру:

    public class MultipleCatchDemo {
        public static void main(String[] args) {
            // We'll add our code here in Step 5
        }
    }
  2. Замените содержимое метода main следующим кодом:

    try {
        int[] numbers = {1, 2, 3};
        int index = 4; // This will cause an ArrayIndexOutOfBoundsException
        int result = numbers[index] / 0; // This line would throw an ArithmeticException if reached
        System.out.println("This line won't be executed.");
    } catch (ArithmeticException e) {
        System.out.println("Caught an ArithmeticException: " + e.getMessage());
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Caught an ArrayIndexOutOfBoundsException: " + e.getMessage());
    } catch (Exception e) {
        System.out.println("Caught a generic Exception: " + e.getMessage());
    }
    
    System.out.println("Program continues after exception handling.");

    Этот код демонстрирует:

    • Несколько блоков catch для обработки различных типов исключений
    • Порядок блоков catch имеет значение: более конкретные исключения должны обрабатываться раньше более общих
  3. Сохраните файл MultipleCatchDemo.java.

  4. Скомпилируйте и запустите программу:

    javac MultipleCatchDemo.java
    java MultipleCatchDemo

    Вы должны увидеть вывод, похожий на следующий:

    Caught an ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3
    Program continues after exception handling.

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

Резюме

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

  1. Понимание исключений: Мы узнали, что такое исключения и как они помогают управлять ошибками в нашем коде.
  2. Использование блоков try-catch: Мы увидели, как использовать блоки try-catch для элегантной обработки исключений, что позволяет нашим программам продолжать работу даже при возникновении ошибок.
  3. Создание и выброс пользовательских исключений: Мы создали собственный тип исключения и узнали, как выбрасывать исключения для сигнализации о конкретных ошибочных ситуациях.
  4. Использование блока finally: Мы научились использовать блок finally для выполнения кода, который должен выполняться независимо от того, возникло ли исключение или нет. Это полезно для операций по очистке ресурсов.
  5. Работа с несколькими блоками catch: Мы увидели, как обрабатывать различные типы исключений с помощью нескольких блоков catch, что позволяет более точно обрабатывать ошибки.

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

По мере продолжения вашего пути в изучении Java вы обнаружите, что эффективная обработка исключений является ключевой частью написания профессионального кода. Практикуйте использование этих техник в своих программах, и вы обязательно станете опытным Java-разработчиком!

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