|
|
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Недавно изучаю Java и не могу понять практической пользы требования объявлять в описании метода : throws и перечисление необрабатываемых, но возможных в нём экцепшнов впервые увидел это в жаве и так и не въехал а зачем вообще это нужно? какая в этом практическая польза для компилятора или среды исполнения? откуда ноги растут и зачем это, на первый взгляд, нелепое требование в языке? Поясните если кто знает, спасибо заранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 13:56:28 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 14:00:55 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Тут надо не Java изучать, а идеологию ООП. Чтобы понять ответ на этот вопрос. Ну а вообщем, весьма полезный механизм при написании устойчивых программ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 14:25:39 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
А это для того, чтобы вышестоящие классы знали о том, что внизу произошла какая-то фигня-с. Вот допустим у тебя есть класс работы с БэДэ. Ты обращаешься к нему, говоришь "сделай инсерт". А коннекшен в это время отваливается. Тогда ты выкидываешь эксцепшен через throw new DBException(). А слово throws в названии метода значит, что метод будет требовать от вышестоящего класса отловить этот самый эксцепшен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 14:26:51 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Вот смотри: Копает рабочий лопатой яму. И вдруг лопата ломается. Что делать? Рабочий не может копать сломанной лопатой, но и не знает, где эти лопаты брать. Тогда он идет к своему бригадиру и говорит "лопата сломалась" (передает ошибку наверх). А бригадир уже знает, где берутся лопаты, поэтому берет ее и отдает рабочему (обрабатывает ошибку). Если ты пишешь класс "рабочий", который не знает, что делать с некоторыми ошибками. Ты должен описать их в throws, чтобы класс "бригадир" знал, какие проблемы могут возникнуть и быть готовым к нему. А вот классу "директор" уже о них знать не нужно - до него они не дойдут. PS. Считаем, что класс "директор" - это Main класс, который создает у себя объекты каких-то классов, которые в свою очередь создают объекты и где-то в конце есть объект класса "бригадир" и созданные им объекты класса "рабочий". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 14:35:03 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
pamirВот смотри: Копает рабочий лопатой яму. И вдруг лопата ломается. Что делать? Рабочий не может копать сломанной лопатой, но и не знает, где эти лопаты брать. Тогда он идет к своему бригадиру и говорит "лопата сломалась" (передает ошибку наверх). А бригадир уже знает, где берутся лопаты, поэтому берет ее и отдает рабочему (обрабатывает ошибку). Если ты пишешь класс "рабочий", который не знает, что делать с некоторыми ошибками. Ты должен описать их в throws, чтобы класс "бригадир" знал, какие проблемы могут возникнуть и быть готовым к нему. А вот классу "директор" уже о них знать не нужно - до него они не дойдут. PS. Считаем, что класс "директор" - это Main класс, который создает у себя объекты каких-то классов, которые в свою очередь создают объекты и где-то в конце есть объект класса "бригадир" и созданные им объекты класса "рабочий". +1 После чего директор получает информацию о том, что у какого-то рабочего сломалась лопата и сменит поставщика лопат :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 14:40:50 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Хорошо, спасибо, всё то что вы описали мне ясно. Задам вопрос иначе - чем отличается механизм обработки ошибок в Java от аналогичного в других языках, и как они эти другие языки обходятся без этих описаний? Ни в дельфе, ни в шарпе ничего подобного нет и никакие дополнительные описания экцепшнов не требуются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 15:17:02 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Потому что разная идеология языка. Джава считается защищенным языком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 15:22:38 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
новичок_в_Java... Ни в дельфе, ни в шарпе ничего подобного нет и никакие дополнительные описания экцепшнов не требуются. И что имеем в результате? Метод бросает исключение, а программа не знает что с ним делать (разработчик не знал об исключении или не захотел его обрабатывать). В результате исключения вместо того, что бы быть обработанным (рабочий получает новую лопату), летит на самый верх и показывается пользователю как красивое окошко с красной иконкой. Только что пользователю с этим делать, если обработка исключение - дело разработчика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 15:31:34 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Верно ли я понимаю, что throws это просто описания ПОМОГАЮЩИЕ пользователям методов узнать о том какие checked-экцепшны от этих методов можно ожидать и не более того? Если таких описаний нет приходится обладать "сверхзнанием" (например из документации) о том какие экцепшны могут порождаться. А здесь это знание уже находится в сигнатурах методов, что несколько упрощает взаимодействие с кодом. Никакие иные функции на это описание не накладываются. Поправьте меня пожалуйста если я чего-то недопонимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 15:35:37 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
что имеем в результате? Метод бросает исключение, а программа не знает что с ним делать Нас и здесь ничто не заставляет его обрабатывать. Обрабатывать или нет это на совести разработчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 15:37:32 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
новичок_в_Java Нас и здесь ничто не заставляет его обрабатывать. Обрабатывать или нет это на совести разработчика. Заставляет. Либо тоже описать trows, либо try/catch. Иначе компилятор пошлёт далеко. -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 15:39:46 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Таким образом, если я правильно понял, throws это некий механизм самодокументирования кода возведённый до уровня обязательного синтаксического требования. Никакой иной функциональности он не несёт и никаких обязательств на разработчика (кроме синтаксических) не накладывает. Обладая этой информацией о вызываемых методах программист сам решает надо ли их обрабатывать (try-блок) или отправлять выше по call-стеку (писать throws). Не вижу в этом ничего связанного с "защищённостью" языка или "идеологией ООП". Как ничто не мешает необработанному экцепшну спокойно долететь до вершины стека вызовов и предстать в виде "красивого окошка с красной иконкой". Всё так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 16:19:42 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
новичок_в_Java Не вижу в этом ничего связанного с "защищённостью" языка или "идеологией ООП". Как ничто не мешает необработанному экцепшну спокойно долететь до вершины стека вызовов и предстать в виде "красивого окошка с красной иконкой". На да, только для этого надо предпринять некоторые усилия (прописать throws у всех). А в SWING'ах всяких будет ещё сложнее. В общем- это затрудняет вылет левых окошек. А с защищённостью связь прямая- это некоторый зачаток "программирования по контракту" :) -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 16:24:57 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Все так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 16:43:25 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
новичок_в_JavaНе вижу в этом ничего связанного с "защищённостью" языка или "идеологией ООП". Как ничто не мешает необработанному экцепшну спокойно долететь до вершины стека вызовов и предстать в виде "красивого окошка с красной иконкой". В .Net все именно так и работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 16:48:08 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный Код: plaintext 1. 2. 3. 4. 5. "Повбывав бы!"(с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:08:37 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный Код: plaintext 1. 2. 3. 4. 5. omg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:13:09 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный Код: plaintext 1. 2. 3. 4. 5. Ужоснах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:16:28 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
AnarionВ Код: plaintext 1. 2. 3. 4. 5. Иногда именно так делать и нужно иногда нет. Все зависит от ситуации. В любом случае, такое категоричное и однозначное заявление - не верно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:23:35 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный Код: plaintext 1. 2. 3. 4. 5. А дальше что? Чем это лучше вообще не обработанных исключений? Как тут уже показали, исключения позволяют передать обработку на тот уровень стека вызовов, на котором ее можно наиболее корректно обработать. И далеко не всегда это должен быть верхний уровень. Например, вам нужно обработать дать возможность пользователю обработать десяток-другой независимых друг от друга XML-файлов. И что, когда во втором файле будет не валидный XML, оставшиеся не обрабатывать? А именно это и произойдет, если мы исключение на верхнем уровне перехватим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:38:13 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
wessen AnarionВ Код: plaintext 1. 2. 3. 4. 5. Иногда именно так делать и нужно иногда нет. Все зависит от ситуации. В любом случае, такое категоричное и однозначное заявление - не верно. Так не нужно делать никогда . Как минимум исключения надо логгировать, а по-нормальному - обрабатывать их, причем в зависимости от типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 18:06:59 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Зашедший wessen AnarionВ Код: plaintext 1. 2. 3. 4. 5. Иногда именно так делать и нужно иногда нет. Все зависит от ситуации. В любом случае, такое категоричное и однозначное заявление - не верно. Так не нужно делать никогда . Как минимум исключения надо логгировать, а по-нормальному - обрабатывать их, причем в зависимости от типа. я думаю автор сего топика имел ввиду делать всегда один try/catch на весь метод, обработка тут непричем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 18:29:09 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
Зашедший AnarionВсе так. И вобще, хорошим стилем считается не плодить кучу try...{} catch{}, а делать на весь класс глобальный Код: plaintext 1. 2. 3. 4. 5. "Повбывав бы!"(с) плюсмильйон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 18:44:28 |
|
||
|
зачем вообще этот throws в объявлении метода?
|
|||
|---|---|---|---|
|
#18+
wessen Зашедший wessen AnarionВ Код: plaintext 1. 2. 3. 4. 5. Иногда именно так делать и нужно иногда нет. Все зависит от ситуации. В любом случае, такое категоричное и однозначное заявление - не верно. Так не нужно делать никогда . Как минимум исключения надо логгировать, а по-нормальному - обрабатывать их, причем в зависимости от типа. я думаю автор сего топика имел ввиду делать всегда один try/catch на весь метод, обработка тут непричем. Во-первых, слова "метод" я там не заметил, только слово "класс". Во-вторых обрабатывать все ошибки используя единственную и пустую секцию catch (Exception) - за такое в продакшн-коде надо сразу увольнять. Хуже только вариант с catch(Throwable) - как пример абсолютной и неизлечимой клиники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 20:34:19 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34765872&tid=2144755]: |
0ms |
get settings: |
15ms |
get forum list: |
26ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
73ms |
get topic data: |
19ms |
get forum data: |
5ms |
get page messages: |
129ms |
get tp. blocked users: |
3ms |
| others: | 310ms |
| total: | 594ms |

| 0 / 0 |
