Почему имеет смысл иметь исключения Runtime Не проверено (в отличие от того, были ли они Проверено)?Почему Runtime Exceptions "unchecked" в Java?
ответ
Если вы этого не сделали, вам придется иметь блоки 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, некоторые люди даже называют проверенные исключения a failed experiment и некоторые люди propose to remove checked exceptions с Java.
+1 для этого аккуратное описание. – Reuben
«Никто не спорит о непроверенных исключениях, однако плохо», - вы были бы удивлены :-) Большой +1 на все остальное. – ChssPly76
благодарит @cletus. – Moeb
На самом деле, если Runtime Exception были проверены, было бы сложно обрабатывать исключения в любом случае, так как почти все, что вы могли бы сделать в блоке catch, могло бы вызвать новые исключения времени выполнения, которые, в свою очередь, придется обрабатывать ... –