Какие виды исключений существуют в 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 не обременяют код обязательной обработкой для ошибок программирования, которые часто невозможно осмысленно обработать в месте возникновения.

Ответ 18+ 🔞

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

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

Первый слой, самый занудный — Проверяемые исключения (Checked Exceptions). Вот эти, сука, как назойливая тёща. Наследуются от Exception, но не от RuntimeException, запомни эту хуйню.

  • Особенность их, блядь, в чём? Компилятор, этот занудный пидор, требует с них взятку. Или ты их в try-catch оборачиваешь, или в сигнатуре метода через throws объявляешь, что, мол, я, блядь, тут не при чём, пусть кто-то выше разбирается. Считается, что от таких ошибок программа может оправиться. Типа файл не найден — ну скажи пользователю, идиот, и всё.
  • Примеры: IOException, SQLException. Всё, что связано с внешним миром, который всегда, сука, подводит.
  • Вот, смотри, как это выглядит в коде, эти мытарства:
// Обязательная обработка, а то не скомпилируется, сволочь!
try {
    FileInputStream fis = new FileInputStream("file.txt"); // готовься к пиздецу
} catch (FileNotFoundException e) { // FileNotFoundException — checked, его ловить ОБЯЗАН
    System.err.println("Файл не найден, гений: " + e.getMessage()); // классика
}

// Или второй путь — сбросить ответственность наверх, как трушный менеджер
public void readFile() throws IOException { ... } // читайте сами, я в доле

Второй слой, самый частый и позорный — Непроверяемые исключения (Unchecked / Runtime Exceptions). А вот это уже наши, родные, косяки программиста! Наследуются от RuntimeException.

  • Особенность: Компилятор на них забивает хуй. Он как бы говорит: "Ну, идиот, если хочешь на null позвать .length() — твои проблемы, делай". Это ошибки логики, кривых рук и пофигизма.
  • Примеры: NullPointerException (король, блядь!), ArrayIndexOutOfBoundsException (выйти за границы массива — это святое).
  • Код, который все пишут и все ненавидят:
String str = null; // гениальный ход
str.length(); // И тут тебе, внезапно, пизда! NullPointerException (unchecked) — компилятор молчал, как партизан.

Третий слой, апокалиптический — Ошибки (Errors). Это уже не наши проблемы, это пиздец уровня JVM. Наследуются от java.lang.Error.

  • Особенность: Это как удар метеорита по серверу. Приложение обычно не должно и не может это ловить. Ну что ты будешь делать с OutOfMemoryError? Рыдать?
  • Примеры: OutOfMemoryError (память кончилась, ёбта), StackOverflowError (зарекурсился до посинения).

А зачем, спрашивается, это ебаное разделение? А вот зачем, умник:

  • Checked Exceptions — это чтобы контролировать recoverable-ошибки ещё на этапе компиляции. Заставляют тебя, распиздяя, хотя бы подумать: "А что, если файла нет? А если сеть упала?". Без обработки — не скомпилируешься, хитрая жопа!
  • Unchecked Exceptions — это чтобы не засирать код обязательными try-catch для ошибок программиста. Ну какой смысл везде ловить NullPointerException? Это же надо код чинить, а не оборачивать в салфетку!

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