9

我的理解是,检查的异常是可以合理地期望调用者从中恢复的异常。我不明白为什么 InstantiationException 会出现这种情况。如果一个类不能被实例化,那么调用者应该做什么?

然后我认为代码编译可能是一个重要的考虑因素 - 因此只有在动态指定类时才会发生这种情况。1 在这种情况下,类可能更像是一个参数,但是我们有 IllegalArgumentException,它是一个运行时异常。

检查哪些标准异常,哪些不检查的原因是什么?

1这是真的吗?

4

5 回答 5

6

我能想到的明确处理这个异常的一个原因(但这不是一个权威的答案):

尝试用反射实例化一个类(因为该类是配置的,而不是静态链接的)。如果它没有预期的构造函数签名,请尝试另一个构造函数。或者其他班级。任何框架代码(例如 Spring)都可能具有这样的逻辑。

于 2011-06-16T08:19:37.223 回答
2

来自 InstantiationException 的 JavaDoc:

当应用程序尝试使用类 Class 中的newInstance方法创建类的实例,但指定的类对象由于它是接口或抽象类而无法实例化时抛出。

这只会在使用 Java 反射时发生,例如,当以编程方式实例化对象时,例如ClassName.class.newInstance()与可以new ClassName()这么说相反。很自然地期望谁使用反射来编写处理任何此类异常的代码,例如实例化抽象类或接口,或者在构造函数调用期间抛出异常(在这种情况下,您可以使用e.getCause())。

预计不会在您的代码中处理它——而是由使用反射的特定 API/库处理。

于 2011-06-16T08:33:07.770 回答
1

Class.newInstance() has an interesting description on when an InstanciationException is thrown [javadoc] :

InstantiationException - if this Class represents an abstract class, an interface, an array class, a primitive type, or void; or if the class has no nullary constructor; or if the instantiation fails for some other reason.

To me it looks like it tries to cover for all cases a statically linked class' instantiation would fail at compile time.

The most important part is the piece I highlighted though. Imagine a constructor that throws a checked exception. What happens if that constructor is called dynamically? Who'll check for that poor checked exception?

于 2011-06-16T08:37:04.527 回答
0

正如您从InstantiationException javadoc的 javadoc 中看到的那样,它被抛出

当应用程序尝试使用类 Class 中的 newInstance 方法创建类的实例,但无法实例化指定的类对象时。

你可以完美地编写这样的代码:

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

noIllegalArgumentException将被抛出。

关于checked并且unchecked更多的是关于导致异常的原因,而不是是否容易从中恢复。请阅读更多关于checkedvs

于 2011-06-16T08:47:00.333 回答
0

尽管检查异常和未检查异常之间存在巨大的灰色区域,并且可以说许多异常可以以一种或另一种方式设计,但这种方式并非如此。这是一个错误,它应该被取消检查。

于 2011-06-16T17:03:12.483 回答