powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / зачем вообще этот throws в объявлении метода?
25 сообщений из 62, страница 1 из 3
зачем вообще этот throws в объявлении метода?
    #34764572
Здравствуйте.

Недавно изучаю Java и не могу понять практической пользы требования объявлять в описании метода :

throws и перечисление необрабатываемых, но возможных в нём экцепшнов

впервые увидел это в жаве и так и не въехал а зачем вообще это нужно? какая в этом практическая польза для компилятора или среды исполнения? откуда ноги растут и зачем это, на первый взгляд, нелепое требование в языке?

Поясните если кто знает, спасибо заранее.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34764596
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34764686
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут надо не Java изучать, а идеологию ООП. Чтобы понять ответ на этот вопрос. Ну а вообщем, весьма полезный механизм при написании устойчивых программ.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34764687
Anarion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это для того, чтобы вышестоящие классы знали о том, что внизу произошла какая-то фигня-с.
Вот допустим у тебя есть класс работы с БэДэ. Ты обращаешься к нему, говоришь "сделай инсерт". А коннекшен в это время отваливается. Тогда ты выкидываешь эксцепшен через throw new DBException().
А слово throws в названии метода значит, что метод будет требовать от вышестоящего класса отловить этот самый эксцепшен.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34764725
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот смотри:
Копает рабочий лопатой яму. И вдруг лопата ломается. Что делать? Рабочий не может копать сломанной лопатой, но и не знает, где эти лопаты брать.
Тогда он идет к своему бригадиру и говорит "лопата сломалась" (передает ошибку наверх). А бригадир уже знает, где берутся лопаты, поэтому берет ее и отдает рабочему (обрабатывает ошибку).
Если ты пишешь класс "рабочий", который не знает, что делать с некоторыми ошибками. Ты должен описать их в throws, чтобы класс "бригадир" знал, какие проблемы могут возникнуть и быть готовым к нему. А вот классу "директор" уже о них знать не нужно - до него они не дойдут.

PS. Считаем, что класс "директор" - это Main класс, который создает у себя объекты каких-то классов, которые в свою очередь создают объекты и где-то в конце есть объект класса "бригадир" и созданные им объекты класса "рабочий".
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34764754
Фотография Хрюхрюшкин.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamirВот смотри:
Копает рабочий лопатой яму. И вдруг лопата ломается. Что делать? Рабочий не может копать сломанной лопатой, но и не знает, где эти лопаты брать.
Тогда он идет к своему бригадиру и говорит "лопата сломалась" (передает ошибку наверх). А бригадир уже знает, где берутся лопаты, поэтому берет ее и отдает рабочему (обрабатывает ошибку).
Если ты пишешь класс "рабочий", который не знает, что делать с некоторыми ошибками. Ты должен описать их в throws, чтобы класс "бригадир" знал, какие проблемы могут возникнуть и быть готовым к нему. А вот классу "директор" уже о них знать не нужно - до него они не дойдут.

PS. Считаем, что класс "директор" - это Main класс, который создает у себя объекты каких-то классов, которые в свою очередь создают объекты и где-то в конце есть объект класса "бригадир" и созданные им объекты класса "рабочий".
+1
После чего директор получает информацию о том, что у какого-то рабочего сломалась лопата и сменит поставщика лопат :)
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34764942
Хорошо, спасибо, всё то что вы описали мне ясно.

Задам вопрос иначе -

чем отличается механизм обработки ошибок в Java от аналогичного в других языках, и как они эти другие языки обходятся без этих описаний?

Ни в дельфе, ни в шарпе ничего подобного нет и никакие дополнительные описания экцепшнов не требуются.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34764975
Anarion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что разная идеология языка. Джава считается защищенным языком.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765026
no13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
новичок_в_Java...
Ни в дельфе, ни в шарпе ничего подобного нет и никакие дополнительные описания экцепшнов не требуются.
И что имеем в результате? Метод бросает исключение, а программа не знает что с ним делать (разработчик не знал об исключении или не захотел его обрабатывать).

В результате исключения вместо того, что бы быть обработанным (рабочий получает новую лопату), летит на самый верх и показывается пользователю как красивое окошко с красной иконкой. Только что пользователю с этим делать, если обработка исключение - дело разработчика?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765054
Верно ли я понимаю, что throws это просто описания ПОМОГАЮЩИЕ пользователям методов узнать о том какие checked-экцепшны от этих методов можно ожидать и не более того?

Если таких описаний нет приходится обладать "сверхзнанием" (например из документации) о том какие экцепшны могут порождаться. А здесь это знание уже находится в сигнатурах методов, что несколько упрощает взаимодействие с кодом.

Никакие иные функции на это описание не накладываются.

Поправьте меня пожалуйста если я чего-то недопонимаю.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765064
что имеем в результате? Метод бросает исключение, а программа не знает что с ним делать

Нас и здесь ничто не заставляет его обрабатывать. Обрабатывать или нет это на совести разработчика.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765073
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новичок_в_Java
Нас и здесь ничто не заставляет его обрабатывать. Обрабатывать или нет
это на совести разработчика.


Заставляет. Либо тоже описать trows, либо try/catch.
Иначе компилятор пошлёт далеко.

--
Алексей
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765255
Таким образом, если я правильно понял, throws это некий механизм самодокументирования кода возведённый до уровня обязательного синтаксического требования.

Никакой иной функциональности он не несёт и никаких обязательств на разработчика (кроме синтаксических) не накладывает.

Обладая этой информацией о вызываемых методах программист сам решает надо ли их обрабатывать (try-блок) или отправлять выше по call-стеку (писать throws).

Не вижу в этом ничего связанного с "защищённостью" языка или "идеологией ООП". Как ничто не мешает необработанному экцепшну спокойно долететь до вершины стека вызовов и предстать в виде "красивого окошка с красной иконкой".

Всё так?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765272
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новичок_в_Java
Не вижу в этом ничего связанного с "защищённостью" языка или "идеологией
ООП". Как ничто не мешает необработанному экцепшну спокойно долететь до
вершины стека вызовов и предстать в виде "красивого окошка с красной
иконкой".


На да, только для этого надо предпринять некоторые усилия (прописать
throws у всех).
А в SWING'ах всяких будет ещё сложнее.
В общем- это затрудняет вылет левых окошек.

А с защищённостью связь прямая- это некоторый зачаток "программирования
по контракту" :)

--
Алексей
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765353
Anarion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765371
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новичок_в_JavaНе вижу в этом ничего связанного с "защищённостью" языка или "идеологией ООП". Как ничто не мешает необработанному экцепшну спокойно долететь до вершины стека вызовов и предстать в виде "красивого окошка с красной иконкой".

В .Net все именно так и работает.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765483
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}

"Повбывав бы!"(с)
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765499
Lennier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}

omg
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765520
Фотография Хрюхрюшкин.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}

Ужоснах
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765554
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnarionВ
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}


Иногда именно так делать и нужно иногда нет. Все зависит от ситуации. В любом случае, такое категоричное и однозначное заявление - не верно.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765621
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}

А дальше что? Чем это лучше вообще не обработанных исключений?
Как тут уже показали, исключения позволяют передать обработку на тот уровень стека вызовов, на котором ее можно наиболее корректно обработать. И далеко не всегда это должен быть верхний уровень. Например, вам нужно обработать дать возможность пользователю обработать десяток-другой независимых друг от друга XML-файлов. И что, когда во втором файле будет не валидный XML, оставшиеся не обрабатывать? А именно это и произойдет, если мы исключение на верхнем уровне перехватим.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765758
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen AnarionВ
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}


Иногда именно так делать и нужно иногда нет. Все зависит от ситуации. В любом случае, такое категоричное и однозначное заявление - не верно.
Так не нужно делать никогда . Как минимум исключения надо логгировать, а по-нормальному - обрабатывать их, причем в зависимости от типа.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765840
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедший wessen AnarionВ
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}


Иногда именно так делать и нужно иногда нет. Все зависит от ситуации. В любом случае, такое категоричное и однозначное заявление - не верно.
Так не нужно делать никогда . Как минимум исключения надо логгировать, а по-нормальному - обрабатывать их, причем в зависимости от типа.

я думаю автор сего топика имел ввиду делать всегда один try/catch на весь метод, обработка тут непричем.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34765872
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедший AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}

"Повбывав бы!"(с)
плюсмильйон.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766070
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen Зашедший wessen AnarionВ
Код: plaintext
1.
2.
3.
4.
5.
 try {
....
}
 catch  (Ecxeption e){
}


Иногда именно так делать и нужно иногда нет. Все зависит от ситуации. В любом случае, такое категоричное и однозначное заявление - не верно.
Так не нужно делать никогда . Как минимум исключения надо логгировать, а по-нормальному - обрабатывать их, причем в зависимости от типа.

я думаю автор сего топика имел ввиду делать всегда один try/catch на весь метод, обработка тут непричем.
Во-первых, слова "метод" я там не заметил, только слово "класс". Во-вторых обрабатывать все ошибки используя единственную и пустую секцию catch (Exception) - за такое в продакшн-коде надо сразу увольнять. Хуже только вариант с catch(Throwable) - как пример абсолютной и неизлечимой клиники.
...
Рейтинг: 0 / 0
25 сообщений из 62, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / зачем вообще этот throws в объявлении метода?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]