Почему исключения времени выполнения не проверяются в Java?

Почему имеет смысл иметь исключения времени выполнения Непроверенные (в отличие от того, если бы они были Проверены)?


person Moeb    schedule 01.11.2009    source источник


Ответы (3)


Если бы вы этого не сделали, вам пришлось бы иметь блоки try/catch каждый раз, когда вы обращаетесь к элементу массива, выполняете операцию деления и многие другие распространенные сценарии.

Другими словами, представьте себе этот код:

Map map = ...
int i = ...
(int[])map.get("foo")[3] = 2334 / i;

нужно было бы проверить наличие ClassCastException, ArrayIndexOutofBoundsException, ArithmeticException, UnsupportedOperationException и NullPointerException, что пришло мне в голову.

С Java проблема не в непроверенных исключениях. Проверенные исключения — очень спорный вопрос. Некоторые говорят, что это был в значительной степени эксперимент с Java, и на практике они не работают, но вы найдете множество людей, которые утверждают, что они хороши.

Однако никто не спорит, что непроверенные исключения — это плохо.

person cletus    schedule 01.11.2009
comment
Однако никто не спорит, что непроверенные исключения - это плохо - вы будете удивлены :-) Зато большой +1 за все остальное. - person ChssPly76; 01.11.2009
comment
На самом деле, если бы Runtime Exception был проверен, было бы сложно обрабатывать исключения в любом случае, поскольку почти все, что вы могли бы сделать в блоке catch, могло вызвать новые исключения времени выполнения, которые, в свою очередь, должны были бы быть обработаны... - person Erich Kitzmueller; 01.11.2009

Идея двух типов исключений в Java (проверенных и непроверенных) заключается в том, что проверенные исключения следует использовать для состояний ошибки, возникновение которых можно обоснованно ожидать, а непроверенные исключения следует использовать для непредвиденных условий ошибки.

Например, если файл не найден, вы получаете FileNotFoundException, и разумно ожидать, что ваша программа сможет справиться с таким условием. Непроверенные исключения следует использовать только для проблем, которые не должны происходить, и это действительно означает, что в программе есть ошибка, если такая проблема возникает. Например, NullPointerException означает, что ваша программа пытается разыменовать переменную с номером null, и это, скорее всего, ошибка.

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

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

Была некоторая критика этой функции в Java, некоторые люди даже называют проверенные исключения неудачный эксперимент, и некоторые люди предлагают удалить отмеченные исключения из Java.

person Jesper    schedule 01.11.2009

Это просто означает, что компилятор не будет заставлять вас искать исключение, но вы все равно можете сгенерировать его во время выполнения. В качестве одного из преимуществ это позволяет вам генерировать новые исключения из ваших классов, не требуя изменения вашего интерфейса, заставляя вызывающие объекты изменять свой код.

person jheddings    schedule 01.11.2009