Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Отличие try…catch от throws

#java #исключения #try_catch


В чем принципиальное отличие 

try {

}catch(Exception e){

}


от throws
    


Ответы

Ответ 1



При обработке исключений всегда есть 2 варианта : либо пробрасываем выше (т.е. добавляем throws к сигнатуре метода), либо обрабатываем "на месте", используя try-catch

Ответ 2



Вопрос в том где вам удобнее произвести эту обработку. try-catch как раз для этой обработки и служит, но не всегда удобно обрабатывать исключение в том месте где оно бросается. throws позволяет не обрабатывать исключение в том месте которое его вызывает, а переложить эту работу на то место в коде где вы будете вызывать метод через сигнатуру которого вы это исключение пробросили. На пример: a() { try { // какой-то код который может выбросить исключение } catch (Exception e) { ... } } b() { a(); // и тут не каких исключений не надо ловить вы его уже поймали } Или если вы не хотите ловить в методе a() то вы можете сделать так: a() throws Exception { // какой-то код который может выбросить исключение но мы его пробрасываем } b() { try { a();// и ловим тут потому что в методе a() мы это делать не стали } catch (Exception e) { ... } } Во втором примере мы могли бы еще дальше его пробрасывать написав b() throws Exception вплоть до метода main и вообще его не ловить, но так лучше не делать. То есть исключение это места где java говорит: тут может быть проблема, а вы должны что-то ответить, на пример: да здесь и обработаем и пишите try-catch или нет здесь не хочу давай потом и с помощью throws откладываете решение.

Ответ 3



Тоже возник подобный вопрос, решил потестить. Вот пример кода: public class Exeptions { static void throwOne() { // не указан throws System.out.println("В теле метода throwOne()"); throw new NullPointerException("нулпоинтер"); } public static void main(String[] args) { try { throwOne(); } catch (NullPointerException e) { e.printStackTrace(); } System.out.println("Возвращение в main"); } } Результат: В теле метода throwOne() java.lang.NullPointerException: нулпоинтер at Exeptions.throwOne(Exeptions.java:6) at Exeptions.main(Exeptions.java:16) Возвращение в main Как видно все прекрасно скомпилировалось, но если выкинуть любое проверяемое исключение и не прописать throws - компилятор выдаст ошибку. Итог: "обязательно указывать throws для всех исключений, кроме тех, которые относятся к классам Error и RuntimeException или любым их подклассам. Все остальные исключения, которые может сгенерировать метод, должны быть объявлены в операторе throws. Если этого не сделать, то во время компиляции возникнет ошибка." - Шилдт.

Комментариев нет:

Отправить комментарий