Назад к вопросам
Junior
97
questionbank

В чем заключается разница между проверяемыми (checked) и непроверяемыми (unchecked) исключениями в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

  • Проверяемые исключения (Checked Exceptions):

    • Наследуются от Exception (но не от RuntimeException).
    • Компилятор проверяет, что эти исключения либо обрабатываются (с помощью try-catch), либо объявляются в сигнатуре метода (с помощью throws).
    • Обычно представляют собой ожидаемые, восстановимые ошибки (например, проблемы с файловым вводом-выводом).
    • Примеры: IOException, FileNotFoundException, SQLException.
  • Непроверяемые исключения (Unchecked Exceptions):

    • Наследуются от RuntimeException или Error.
    • Компилятор не требует явной обработки или объявления в сигнатуре метода.
    • Обычно представляют собой ошибки программирования или невосстановимые ситуации (например, выход за пределы массива, нулевой указатель).
    • Примеры: NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException, ArithmeticException.

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

// Пример использования проверяемого исключения
import java.io.FileReader;
import java.io.IOException;

public class CheckedExample {
    public static void main(String[] args) {
        try {
            FileReader file = new FileReader("nonexistentfile.txt"); // Может выбросить FileNotFoundException (проверяемое)
            // Чтение из файла
        } catch (IOException e) { // Обработка проверяемого исключения
            System.err.println("Ошибка при работе с файлом: " + e.getMessage());
        }
    }
}
// Пример использования непроверяемого исключения
public class UncheckedExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        try {
            System.out.println(numbers[5]); // Может выбросить ArrayIndexOutOfBoundsException (непроверяемое)
        } catch (ArrayIndexOutOfBoundsException e) { // Обработка не обязательна, но возможна
             System.err.println("Ошибка: выход за пределы массива");
        }

        String str = null;
        // str.length(); // Может выбросить NullPointerException (непроверяемое) - компилятор не требует try-catch
    }
}