Почему InstantiationException является проверенным исключением? - PullRequest
9 голосов
/ 16 июня 2011

Насколько я понимаю, проверенные исключения - это те, от которых можно ожидать восстановления вызывающей стороны.Я не понимаю, почему это так с InstantiationException.Если класс не может быть создан, то что должен делать вызывающий объект?

Тогда я подумал, что, возможно, важным моментом было то, что код скомпилирован - поэтому это может произойти, только если класс указан динамически. 1 В этом случае класс может быть больше похож на параметр, но тогда у нас есть исключение IllegalArgumentException, которое является исключением времени выполнения.

Какова рациональная основа для проверки стандартных исключений, икоторые нет?

1 Это правда?

Ответы [ 5 ]

6 голосов
/ 16 июня 2011

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

Попробуйте создать экземпляр класса с отражением (поскольку этот класс настроен, а не статически связан).Если у него нет ожидаемой подписи конструктора, попробуйте другой конструктор.Или другой класс.Любой каркасный код (например, Spring) может иметь такую ​​логику.

2 голосов
/ 16 июня 2011

Из JavaDoc для InstantiationException:

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

Это произойдет только при использовании отражения Java, например когда программно создаются объекты, например, ClassName.class.newInstance() в отличие от new ClassName() так сказать. Вполне естественно ожидать, что тот, кто использует отражение, напишет код, который обрабатывает такие аберрации, как создание абстрактного класса или интерфейса или возникновение исключения во время вызова конструктора (в этом случае вы можете использовать e.getCause()).

Ожидается, что он не будет обработан в вашем коде, а скорее именно тем API / библиотекой, которая использует отражение.

1 голос
/ 16 июня 2011

Class.newInstance () имеет интересное описание того, когда генерируется исключение InstanciationExceptionкласс массива, примитивный тип или void;или если класс не имеет нулевого конструктора;или , если создание экземпляра завершается неудачей по какой-либо другой причине .

Мне кажется, что он пытается охватить все случаи, когда создание статически связанного класса завершится неудачно во время компиляции.

Самая важная часть - это фрагмент, который я выделил. Представьте себе конструктор, который выдает проверенное исключение. Что произойдет, если этот конструктор вызывается динамически?Кто проверит это плохое проверенное исключение?

0 голосов
/ 16 июня 2011

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

0 голосов
/ 16 июня 2011

Как вы можете видеть из javadoc InstantiationException javadoc , он выбрасывается

, когда приложение пытается создать экземпляр класса, используя метод newInstance в классе Class, ноуказанный объект класса не может быть создан.

Вы можете идеально написать такой код:

try {
Class myClass = Class.forName("Myclass");
myClass.newInstance();
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}

нет IllegalArgumentException будет брошено.

О checked и unchecked это больше о том, что вызвало исключение, а не о том, легко ли восстанавливаться или нет.Пожалуйста, прочитайте больше о checked против

...