Что такое проверенные исключения в Java / C #? - PullRequest
25 голосов
/ 21 февраля 2012

Я - разработчик на C #, время от времени пишу на Java. Может кто-нибудь объяснить простыми словами, что такое проверенные исключения в Java и зачем это нужно? Не встречал этот термин в C #.

Ответы [ 4 ]

56 голосов
/ 21 февраля 2012

Проверенные исключения - это исключения, которые компилятор требует от вас каким-либо образом обрабатывать.

В Java отмечены следующие исключения: Throwable с, которые не RuntimeException, Error или один из их подклассов.

Разработчики Java чувствовали, что они необходимы для обеспечения того, чтобы программы обрабатывали исключения, которые были достаточно вероятными. Классическим примером является IOException. Каждый раз, когда программа выполняет ввод-вывод, существует вероятность сбоя. Диск может быть заполнен, файл может не существовать, могут быть проблемы с разрешениями и т. Д.

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

C # не имеет проверенных исключений. Они решили оставить этот вопрос на усмотрение разработчиков приложений ( интервью ). Проверенные исключения являются спорными, потому что они могут сделать код многословным, в то время как разработчики иногда обрабатывают их тривиально с пустыми блоками catch. Кроме того, может быть произвольно, какие стандартные методы библиотеки генерируют проверенные исключения. Например, почему File.delete (новый Java 7 API делает это по-другому) не выбрасывает IOException?

Еще одна проблема, которую Хейлсберг отметил в этом интервью, - это возможность проверки версий. Добавление проверенного исключения в предложение throw заставляет весь код, использующий этот метод, быть измененным и перекомпилированным.

6 голосов
/ 21 февраля 2012

В Java проверенное исключение (как правильно указывает Мэтью Флашен) является исключением, которое компилятор требует от вас обработать. Это исключения, которые объявляются в определениях функций (например, function bob() throws ImNotBobException { ... }, чтобы сказать, что вызов этой функции может вызвать это исключение - например, NumberFormatException при анализе целого числа или IOException при записи в файл.

Однако некоторые исключения могут создаваться из неизвестных или неожиданных мест, которые просто непрактично обрабатывать на каждом уровне, поэтому компилятор не требует, чтобы вы обрабатывали их. Это непроверенные исключения . Они могут быть выброшены из разных мест, которые не объявляют их (часто пытаясь вызвать метод объекта, когда этот объект еще не был инициализирован, то есть равен нулю - это приведет к NullPointerException.)

Надеюсь, это поможет.

0 голосов
/ 12 декабря 2016

(несколько лет спустя, для людей, прибывающих сюда через авиакомпании Google)

Проверенные исключения были ошибкой в ​​дизайне языка Java. СРОК. Всякий раз, когда вы обнаружите проверенное исключение, заключите их в непроверенное исключение (возможно, RuntimeException).

К сожалению, из-за проблем с маркетингом сначала Sun, а затем Oracle не смогли открыто признать свою ошибку.

Во время создания Java обработка исключений была неясной. Java-дизайнеры наивно полагали, что принуждать разработчиков проверять исключения во время компиляции - хорошая идея. Хотя это выглядит интуитивно правильным, это оказалось анти-паттерном, похожим на использование «GOTO». Это никогда не работало на практике и вызывает много проблем. Исключения должны обрабатываться в «главном цикле» или «контроллере», поскольку в противном случае, если бы они могли обрабатываться внутри функции, вызывающей ошибку, они не были бы исключением, а предполагаемой ошибкой, которая должна поддерживаться нормальное возвращаемое значение API. Исключение, по своей природе, является чем-то, что не рассматривается, и это не допускает нормальное выполнение кода в потоке.

Обратите внимание, например, на то, что Spring, «стандартная» среда Java для разработки корпоративных приложений, просто ограничивает превращение проверенных исключений в непроверенные исключения.

Для справки: Kotlin, разработанный экспертами по Java и Scala и одним из самых популярных языков в исследованиях стекового потока ), полностью исключил проверенные исключения. Более подробная информация доступна по адресу: 2

0 голосов
/ 21 февраля 2012

Проверенные исключения - это исключения, которые требуют от любого «потребляющего» класса кода, который явно проверяет (и, надеюсь, обрабатывает) исключение.

Например, если в классе Apple есть метод Eat (), который включаетпроверенное исключение WormFound, тогда любой код, вызывающий этот метод, должен явно иметь перехват для этого исключения.

В качестве примечания, это особенность Java, а не C #.

(На момент создания C # плюсы проверенных исключений были не столь очевидны в глазах команды C #, поэтому они не были включены.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...