Почему имеет смысл иметь исключения времени выполнения Непроверенные (в отличие от того, если бы они были Проверены)?
Почему исключения времени выполнения не проверяются в Java?
Ответы (3)
Если бы вы этого не сделали, вам пришлось бы иметь блоки try/catch каждый раз, когда вы обращаетесь к элементу массива, выполняете операцию деления и многие другие распространенные сценарии.
Другими словами, представьте себе этот код:
Map map = ...
int i = ...
(int[])map.get("foo")[3] = 2334 / i;
нужно было бы проверить наличие ClassCastException
, ArrayIndexOutofBoundsException
, ArithmeticException
, UnsupportedOperationException
и NullPointerException
, что пришло мне в голову.
С Java проблема не в непроверенных исключениях. Проверенные исключения — очень спорный вопрос. Некоторые говорят, что это был в значительной степени эксперимент с Java, и на практике они не работают, но вы найдете множество людей, которые утверждают, что они хороши.
Однако никто не спорит, что непроверенные исключения — это плохо.
Идея двух типов исключений в Java (проверенных и непроверенных) заключается в том, что проверенные исключения следует использовать для состояний ошибки, возникновение которых можно обоснованно ожидать, а непроверенные исключения следует использовать для непредвиденных условий ошибки.
Например, если файл не найден, вы получаете FileNotFoundException
, и разумно ожидать, что ваша программа сможет справиться с таким условием. Непроверенные исключения следует использовать только для проблем, которые не должны происходить, и это действительно означает, что в программе есть ошибка, если такая проблема возникает. Например, NullPointerException
означает, что ваша программа пытается разыменовать переменную с номером null
, и это, скорее всего, ошибка.
Компилятор Java заставляет программиста обрабатывать проверенные исключения. Это делает язык программирования более безопасным — значит, программист вынужден думать об условиях возникновения ошибки, что должно сделать программу более надежной.
Компилятор не проверяет непроверенные исключения, потому что непроверенные исключения в любом случае не должны возникать, а если и случаются, то программа не может ничего сделать во время выполнения; программист должен решить ошибку.
Была некоторая критика этой функции в Java, некоторые люди даже называют проверенные исключения неудачный эксперимент, и некоторые люди предлагают удалить отмеченные исключения из Java.
Это просто означает, что компилятор не будет заставлять вас искать исключение, но вы все равно можете сгенерировать его во время выполнения. В качестве одного из преимуществ это позволяет вам генерировать новые исключения из ваших классов, не требуя изменения вашего интерфейса, заставляя вызывающие объекты изменять свой код.