Почему InstantiationException является проверенным исключением?
Насколько я понимаю, проверенные исключения - это те, от которых можно ожидать восстановления вызывающей стороны. Я не понимаю, почему это так с InstantiationException. Если класс не может быть создан, то что должен делать вызывающий объект?
Затем я подумал, что, возможно, важным моментом было то, что код был скомпилирован - поэтому это может произойти, только если класс указан динамически.1 В этом случае класс может быть больше похож на параметр, но тогда у нас есть исключение IllegalArgumentException, которое является исключением времени выполнения.
Какова рациональная причина, по которой проверяются стандартные исключения, а какие нет?
1 Это правда?
5 ответов
Одна из причин явной обработки этого исключения, о котором я могу подумать (но это не авторитетный ответ):
Попробуйте создать экземпляр класса с отражением (потому что этот класс настроен, а не статически связан). Если у него нет ожидаемой подписи конструктора, попробуйте другой конструктор. Или другой класс. Любой каркасный код (например, Spring) может иметь такую логику.
Из JavaDoc для InstantiationException:
Брошенный, когда приложение пытается создать экземпляр класса, используя метод newInstance в классе Class, но указанный объект класса не может быть создан, потому что это интерфейс или абстрактный класс.
Это произойдет только при использовании отражения Java, например, когда программно создаются экземпляры объектов, например ClassName.class.newInstance()
в отличие от new ClassName()
так сказать. Вполне естественно ожидать, что тот, кто использует отражение, будет писать код, который обрабатывает любые такие аберрации, как создание абстрактного класса или интерфейса, или если во время вызова конструктора возникает исключение (в этом случае вы можете использовать e.getCause()
).
Ожидается, что он не будет обработан в вашем коде - скорее, тем конкретным API/ библиотекой, которая использует отражение.
Class.newInstance() имеет интересное описание того, когда создается исключение InstanciationException [javadoc]:
InstantiationException - если этот Класс представляет абстрактный класс, интерфейс, класс массива, тип примитива или void; или если класс не имеет нулевого конструктора; или если инстанциация не удалась по какой-либо другой причине.
Мне кажется, он пытается охватить все случаи, когда создание статически связанного класса завершится неудачно во время компиляции.
Самая важная часть - это часть, которую я выделил. Представьте себе конструктор, который выдает проверенное исключение. Что произойдет, если этот конструктор вызывается динамически? Кто проверит это бедное проверенное исключение?
Хотя между проверочными и непроверенными исключениями существует огромная серая область, и многие исключения могут быть спроектированы тем или иным образом, это не так. Это ошибка, это должно было быть проверено.
Как вы можете видеть из 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
против