Ответ
Технически — да, но делать этого не рекомендуется.
Почему можно?
Ключевое слово throw в Java ожидает объект, наследующий от класса Throwable. Поскольку Throwable является корневым классом всей иерархии исключений, его можно использовать.
// Скомпилируется и выполнится
public void badPractice() throws Throwable {
throw new Throwable("Это Throwable");
}
Почему не нужно?
- Нарушение семантики:
Throwableимеет двух прямых наследников:Error— для критических, невосстанавливаемых ошибок JVM (например,OutOfMemoryError). Их ловить обычно не следует.Exception— для исключительных ситуаций, которые программа может обработать. БросаяThrowable, вы смешиваете эти принципиально разные категории.
- Избыточность и плохой стиль: Обработка
Throwableвcatch-блоке заставит перехватывать иError, что почти всегда неверно. - 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");
}
Но это, блядь, как взять кувалду, чтобы гвоздь в стенку забить. Технически — да, заебись, стена будет, но и половину квартиры в пизду угробишь, понимаешь?
А почему не надо, блядь? Да потому что:
-
Семантика, ёпта! У
Throwableдва сыночка-дурачка:Error— это когда у тебя JVM ебнулась, память кончилась, всё, пиздец, приехали. Ловить это — себя не уважать.Exception— а вот это уже наши, родные, программные косяки, которые можно и нужно ловить. Кидая гологоThrowable, ты как будто кричишь: «ОЙ, ВСЁ!» — и не важно, батарейка в мышке села или ядро процессора расплавилось. Хуйня полная.
-
Стиль, блядь! Представь, ты пишешь
catch (Throwable t). Ты теперь ловишь ВСЁ. ИOutOfMemoryError, и то, что сосед сверху дрелью в стенку долбит. И что ты с этимErrorсделаешь? Правильно, нихуя. Прога всё равно рухнет, а ты ещё и в логи какую-то хуйню непонятную запишешь. -
Правильно так, ёбана! Используй конкретные исключения, будь мужиком, а не распиздяем.
- Если проблема ожидаемая и её надо обработать — кидай наследника
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 кидать — это как на собеседовании на вопрос «расскажите о себе» начать с истории про то, как в песочнице в детстве совочком по башке дали. Технически — да, это часть тебя, но всем, блядь, похуй, и выглядишь ты идиотом.