Есть ли целесообразность использования оператора throws?

Приветствую!
Продолжаю почитывать книгу Шилдта "Java 8. Полное руководство"
Параллельно, само собой, экспериментирую с приведенными примерами. Заинтересовал такой пример использования оператора throws
Шилдт пишет, что если метод генерирует исключение, которое сам не обрабатывает, то для того, что программа успешно скомпилировалась необходимо обязательно дополнить объявление метода указанием оператора throws и списка исключений, который тот порождает, но оставляет на разбор последующему коду.
Цитата из книги "Ниже приведен пример неверно написанной программы, пытающейся сгенерировать
исключение, которое в самой программе не перехватывается. Эта программа
не подлежит компиляции , поскольку в ней отсутствует оператор throws,
в котором объявляется неперехватываемое исключение.
Эта программа с одержит ошибку , и поэтому она не подлежит компиляции
c l a s s Throws Demo {
s t a t i c void t h r owOn e ( ) {
)
S y s t em . out . p r i n t l n ( " B теле ме тода t h r owOne ( ) . " ) ;
throw new I l l eg alAcc e s s Excep t i on ( " дeмoнc тpaция " ) ;
puЫ i c s ta t i c void ma i n ( S t r ing a r gs [ ] ) {
throwOne ( ) ;

Чтобы эту программу можно было скомпилировать, в ее исходный следует
внести два изменения. Во-первых, объявить в методе throwOne ( ) генерирование исключения типа IllegalAccessException . И во-вторых, определить в методе main( ) блок оператора try/catch для перехвата этого исключения. Ниже приведен исправленный код данной программы."

Я покрутил текст программы и обнаружил, что такой вариант тоже собирается и работает:
static void testException()
        {
         
             throw new ArithmeticException("Арифметическая ошибка"); // тут порождаем исключение
        }
public static void main(String[] args) {
        // TODO code application logic here
        try{
        testException();
        }
        catch(ArithmeticException e)
        {
            System.out.println(e + "Vot tut"); // здесь отлавливаем исключение, которое породил наш метод
        }
        
}

Т.е. теперь мне непонятно зачем использовать оператор trows, ведь и без него все работает?
  • Вопрос задан
  • 459 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev
software engineer
Для того, чтобы научиться работать с перехватом конкретных исключений, не обязательно писать программу с ошибкой. Можно просто напрямую вызвать эту ошибку(исключение) командой throw.

То есть в данном случае задача не в том, чтобы кидать исключения, а научиться их правильно перехватывать.
И тут пример, как вы делаете catch ранее throw исключения.
В нормальной программе throw не нужен, это нужно временно, для отладки ваших catch
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
compilator
@compilator
Senior Data Engineer
"Т.е. теперь мне непонятно зачем использовать оператор trows, ведь и без него все работает?"

Есть исключения проверяемые (checked), а есть не проверяемые (unchecked). Отсюда и пляшите )
Легко гуглится.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы