Разрешено ли в Java бросать исключения типа Throwable?

Ответ

Технически — да, но делать этого не рекомендуется.

Почему можно? Ключевое слово throw в Java ожидает объект, наследующий от класса Throwable. Поскольку Throwable является корневым классом всей иерархии исключений, его можно использовать.

// Скомпилируется и выполнится
public void badPractice() throws Throwable {
    throw new Throwable("Это Throwable");
}

Почему не нужно?

  1. Нарушение семантики: Throwable имеет двух прямых наследников:
    • Error — для критических, невосстанавливаемых ошибок JVM (например, OutOfMemoryError). Их ловить обычно не следует.
    • Exception — для исключительных ситуаций, которые программа может обработать. Бросая Throwable, вы смешиваете эти принципиально разные категории.
  2. Избыточность и плохой стиль: Обработка Throwable в catch-блоке заставит перехватывать и Error, что почти всегда неверно.
  3. Best Practice: Всегда используйте максимально конкретные типы исключений.
    • Для проверяемых исключений — наследники Exception (например, IOException, SQLException).
    • Для непроверяемых (runtime) исключений — наследники RuntimeException (например, IllegalArgumentException, NullPointerException).

Правильный подход:

// Вместо Throwable используйте конкретное исключение
public void processFile(String path) throws IOException {
    if (path == null) {
        // Непроверяемое исключение
        throw new IllegalArgumentException("Path cannot be null");
    }
    // ... код, который может выбросить IOException
}

Ответ 18+ 🔞

А, слушай, тут один умник на форуме спрашивает, можно ли в Java Throwable кидать. Ну, типа, технически-то можно, блядь, конечно! Это ж корень всей этой ёбанной иерархии исключений, как дед мороз для всех этих Exception и Error. Код-то скомпилируется, ёпта!

// Да, скомпилируется, сука, и даже выполнится!
public void badPractice() throws Throwable {
    throw new Throwable("Это Throwable");
}

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

А почему не надо, блядь? Да потому что:

  1. Семантика, ёпта! У Throwable два сыночка-дурачка:

    • Error — это когда у тебя JVM ебнулась, память кончилась, всё, пиздец, приехали. Ловить это — себя не уважать.
    • Exception — а вот это уже наши, родные, программные косяки, которые можно и нужно ловить. Кидая голого Throwable, ты как будто кричишь: «ОЙ, ВСЁ!» — и не важно, батарейка в мышке села или ядро процессора расплавилось. Хуйня полная.
  2. Стиль, блядь! Представь, ты пишешь catch (Throwable t). Ты теперь ловишь ВСЁ. И OutOfMemoryError, и то, что сосед сверху дрелью в стенку долбит. И что ты с этим Error сделаешь? Правильно, нихуя. Прога всё равно рухнет, а ты ещё и в логи какую-то хуйню непонятную запишешь.

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

    • Если проблема ожидаемая и её надо обработать — кидай наследника Exception (типа IOException).
    • Если программист-коллега — мудак и передал тебе null вместо строки — хуячь ему IllegalArgumentException, наследник RuntimeException.

Вот как надо, чтобы не было стыдно:

// Вместо Throwable — чётко и по делу, сука!
public void processFile(String path) throws IOException {
    if (path == null) {
        // А вот это — непроверяемое, на, получи, распишись, дебил!
        throw new IllegalArgumentException("Path cannot be null");
    }
    // ... а тут уже может вылететь IOException, и мы его честно объявили
}

Короче, Throwable кидать — это как на собеседовании на вопрос «расскажите о себе» начать с истории про то, как в песочнице в детстве совочком по башке дали. Технически — да, это часть тебя, но всем, блядь, похуй, и выглядишь ты идиотом.