|
|
|
Почему в Java введено ключевое слово throws?
|
|||
|---|---|---|---|
|
#18+
Сразу хочу попросить не бросаться в меня камнями :-) В Java я человек новый, до этого писал на C#. Надеюсь, что вопросы не слишком глупые. :-) Само назначение throws мне понятно, но поскольку в том же C# нет ничего аналогичного, хотелось бы достичь концепции, идеологического назначения throws в Java. Призываю на помощь людей опытных. :-) Почему, собственно говоря, спрашиваю. Как выглядит картина в C#: метод А вызвал метод B. Метод B вызвал метод C. В методе C сгенерировано исключение. Оно поднимается вверх на уровень метода B, в котором оно либо отлавливается, либо, если не отлавливается, пропускается выше, в метод A. Таким образом метод A - становится последним форпостом. Не отловит он - приложение завершится с выводом сообщения о неперехваченном исключении. Это например. В Java несколько иначе. Нужно явно указать, что метод может породить исключение, не обработав его или сгенерировав самостоятельно в каких-то условиях. Почему так? Первое, что с неопытности в Java напрашивается, это почти все методы снабдить throws. Но что-то мне подсказывает, что это от недопонимания идеологии исключений в Java. Вопрос первый: почему явно помечаем методы, способные породить исключение? Чем плоха идея, что все методы по умолчанию throws? Вопрос второй: как избежать повсеместного использования throws? Как грамотнее работать с исключениями? Ссылки/книги приветствуются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2014, 19:51 |
|
||
|
Почему в Java введено ключевое слово throws?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2014, 20:24 |
|
||
|
Почему в Java введено ключевое слово throws?
|
|||
|---|---|---|---|
|
#18+
ДобрыйЧеловек , В Java есть два типа исключений - checked и unchecked. По смыслу checked исключения являются частью контракта метода, частью его описания. В духе "метод A принимает int, возвращает long, а еще может бросить MyException, который надо обязательно обработать". В .Net такого нет, все исключения являются unchecked. Потому нет и ключевого слова throws. Изначально идея checked исключений состояла в том, что бы сделать описание методов более наглядным, и повысить качество кода. По факту же это делает код значительно более громоздким из-за обилия try-catch блоков даже там, где ничего обработать нельзя по логике приложения. Поэтому большинство современных высокоуровневых фреймворков уходят от checked исключений. Например: JDBC - низкоуровневый интерфейс для взаимодействия с СУБД, бросает checked SQLException везде, где только можно. Hibernate - высокоуровневая обертка вокруг JDBC, которая ловит checked SQLException, заворачивает его в свои unchecked исключения, и пробрасывает дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2014, 20:27 |
|
||
|
Почему в Java введено ключевое слово throws?
|
|||
|---|---|---|---|
|
#18+
ДобрыйЧеловекВ Java несколько иначе. Нет, в джава всё также. Разница только в том, что некоторые исключения на этапе компиляции проверяются, что их поймают или пробросят дальше. ДобрыйЧеловекпочему явно помечаем методы, способные породить исключение? Чем плоха идея, что все методы по умолчанию throws? Так и есть, все методы по умолчанию throws. Плоха тем что таки можно забыть поймать исключение которое вполне можно было поймать, обработать и корректно продолжить работу программы. ДобрыйЧеловеккак избежать повсеместного использования throws? Как грамотнее работать с исключениями?Только надо понимать зачем ты хочешь отказаться от проверок компилятором.. 1. Унаследовать его от RuntimeExeption или если оно не твоё обернуть в RuntimeExeption (лучше в свой наследник RuntimeExeption) и бросить. 2. Сделать свой компилятор, который не проверяет проверяемые исключения (на уровне байткода это возможно). 3. http://projectlombok.org/features/SneakyThrows.html (но эта фича уже будет требовать lombok в рантайме). 4. Scala\Kotlin.. (Может ещё какие-нибудь Fantom'ы\Gosu\Rhino\Groovy и прочие не нужные языки тоже не проверяют checked exceptions). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2014, 20:52 |
|
||
|
Почему в Java введено ключевое слово throws?
|
|||
|---|---|---|---|
|
#18+
ДобрыйЧеловекВ Java несколько иначе. Нужно явно указать, что метод может породить исключение, не обработав его или сгенерировав самостоятельно в каких-то условиях. Почему так? В java есть 3 типа исключений. 1. Внутренние ошибки jvm. Нормальные люди не обрабатывают. Типа out of memory, ошибки чётности и т.п. RuntimeError и наследники. 2. Ошибки программы. Деление на 0, ошибка преобразования типа и т.п. Можно ронять программу, если встретилось- ошибка же, не факт, то работать можно. RuntimeException и наследники. 3. Ошибки ВНЕШНЕГО мира. Сеть, диск. Они естественным образом возникают при работе программы- сервер недоступен, место на диске закончилось, нет прав записи в этот каталог и т.п. Их надо корректно обрабатывать- повторить запрос, уточнить у пользователя путь, предложить почистить диск. И чтобы программист не забыл- их сделали checked - т.е. метод не может их кинуть, не объявив в throws. А при вызове его- либо обработать, либо явно сказать, что оно вылетит. Либо, если вылетать не должно- превратить в RuntimeException. Интересная особенность- реализация интерфейса не может добавить checked exception ;) Что правильно, но иногда напрягает. При дизайне иногда бывают ошибки, что куда кидать- например NumberFormatException скорее должно быть checked. Почему-то многие разработчики считают, что checked exception не нужны. Да, наследуют свои ошибки от RuntimeException. В C# вообще отказались от них (т.е. Хейлсберг тоже считает checked exception лишними). По мне- так хорошая штука, хотя заставляет думать о себе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2014, 08:51 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=148&tid=2126121]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 297ms |

| 0 / 0 |
