Использование ключевого слова throws не является плохой практикой само по себе, а является частью механизма обработки исключений в Java для Checked Exceptions. Оно указывает вызывающему коду, что метод может выбросить определенный тип исключения, который вызывающий код должен либо обработать (catch), либо также объявить в своей сигнатуре (throws).
Однако, чрезмерное или некорректное его использование может привести к следующим проблемам, что может быть расценено как "плохая практика" в определенных контекстах:
throws. Если метод может выбросить множество разных типов исключений, это усложняет код вызывающего.throws раскрывает внутренние детали реализации метода, так как оно показывает, какие исключения могут возникнуть внутри. Изменение реализации может потребовать изменения сигнатуры метода.throws) вверх по стеку вызовов, вместо того чтобы обрабатывать их на соответствующем уровне. Это может привести к тому, что исключение дойдет до верхнего уровня приложения и приведет к его аварийному завершению без должной обработки.throws в основном предназначен для "Checked Exceptions" – ситуаций, с которыми код может столкнуться и из которых можно восстановиться или предпринять альтернативный путь. Для "Unchecked Exceptions" (например, NullPointerException, ArrayIndexOutOfBoundsException), которые обычно указывают на ошибку программирования, throws использовать не нужно, так как они являются подклассами RuntimeException и не требуют обязательной обработки.Важно различать, является ли исключение ситуацией, от которой можно восстановиться (и тогда throws уместно для Checked Exceptions), или указывает на ошибку программиста (и тогда Unsupported Operation ExecutionException или IllegalStateException могут быть брошены как Unchecked Exceptions).
Вместо бездумного использования throws рекомендуется:
RuntimeException и его подклассы) для обозначения ошибок программирования или ситуаций, от которых невозможно восстановиться на данном уровне абстракции.java