Ответ
Технически — да, но делать этого не рекомендуется.
Почему можно?
Ключевое слово 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
}