Какие виды исключений существуют в Java и чем они отличаются?

«Какие виды исключений существуют в Java и чем они отличаются?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

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

      // Обязательная обработка
      try {
          FileInputStream fis = new FileInputStream("file.txt");
      } catch (FileNotFoundException e) { // FileNotFoundException - checked
          System.err.println("Файл не найден: " + e.getMessage());
      }
      
      // Или объявление в throws
      public void readFile() throws IOException { ... }
  2. Непроверяемые исключения (Unchecked Exceptions / Runtime Exceptions)

    • Наследуются от: java.lang.RuntimeException.
    • Особенность: Компилятор не проверяет их обработку. Обычно указывают на ошибки программирования (логические ошибки, неправильное использование API).
    • Примеры: NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException.
    • Пример кода:
      String str = null;
      str.length(); // Выбросит NullPointerException (unchecked)
  3. Ошибки (Errors)

    • Наследуются от: java.lang.Error.
    • Особенность: Критические проблемы уровня JVM или системы, которые приложение обычно не может или не должно обрабатывать.
    • Примеры: OutOfMemoryError, StackOverflowError, LinkageError.

Почему такое разделение?

  • Checked Exceptions обеспечивают контроль над recoverable-ошибками на этапе компиляции, заставляя разработчика продумать сценарии восстановления.
  • Unchecked Exceptions не обременяют код обязательной обработкой для ошибок программирования, которые часто невозможно осмысленно обработать в месте возникновения.