powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему в Java введено ключевое слово throws?
5 сообщений из 5, страница 1 из 1
Почему в Java введено ключевое слово throws?
    #38827079
Сразу хочу попросить не бросаться в меня камнями :-)
В Java я человек новый, до этого писал на C#.
Надеюсь, что вопросы не слишком глупые. :-)
Само назначение throws мне понятно, но поскольку в том же C# нет ничего аналогичного, хотелось бы достичь концепции, идеологического назначения throws в Java.
Призываю на помощь людей опытных. :-)
Почему, собственно говоря, спрашиваю.
Как выглядит картина в C#:
метод А вызвал метод B. Метод B вызвал метод C.
В методе C сгенерировано исключение. Оно поднимается вверх на уровень метода B, в котором оно либо отлавливается, либо, если не отлавливается, пропускается выше, в метод A. Таким образом метод A - становится последним форпостом. Не отловит он - приложение завершится с выводом сообщения о неперехваченном исключении.
Это например.
В Java несколько иначе. Нужно явно указать, что метод может породить исключение, не обработав его или сгенерировав самостоятельно в каких-то условиях. Почему так? Первое, что с неопытности в Java напрашивается, это почти все методы снабдить throws. Но что-то мне подсказывает, что это от недопонимания идеологии исключений в Java.
Вопрос первый: почему явно помечаем методы, способные породить исключение? Чем плоха идея, что все методы по умолчанию throws?
Вопрос второй: как избежать повсеместного использования throws? Как грамотнее работать с исключениями?
Ссылки/книги приветствуются.
...
Рейтинг: 0 / 0
Почему в Java введено ключевое слово throws?
    #38827099
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему в Java введено ключевое слово throws?
    #38827100
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДобрыйЧеловек ,
В Java есть два типа исключений - checked и unchecked. По смыслу checked исключения являются частью контракта метода, частью его описания. В духе "метод A принимает int, возвращает long, а еще может бросить MyException, который надо обязательно обработать".
В .Net такого нет, все исключения являются unchecked. Потому нет и ключевого слова throws.

Изначально идея checked исключений состояла в том, что бы сделать описание методов более наглядным, и повысить качество кода. По факту же это делает код значительно более громоздким из-за обилия try-catch блоков даже там, где ничего обработать нельзя по логике приложения.

Поэтому большинство современных высокоуровневых фреймворков уходят от checked исключений. Например:
JDBC - низкоуровневый интерфейс для взаимодействия с СУБД, бросает checked SQLException везде, где только можно.
Hibernate - высокоуровневая обертка вокруг JDBC, которая ловит checked SQLException, заворачивает его в свои unchecked исключения, и пробрасывает дальше.
...
Рейтинг: 0 / 0
Почему в Java введено ключевое слово throws?
    #38827108
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДобрыйЧеловекВ 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).
...
Рейтинг: 0 / 0
Почему в Java введено ключевое слово throws?
    #38827643
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйЧеловекВ 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 лишними). По мне- так хорошая штука, хотя заставляет думать о себе...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему в Java введено ключевое слово throws?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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