我的理解是,已检查的例外是那些可以合理地预期从中恢复的人。我不明白为什么这是InstantiationException的情况。如果一个类无法实例化,那么调用者应该做什么?
然后我认为这可能是代码编译时的重要考虑因素 - 因此只有在动态指定类时才会发生这种情况。 1 在这种情况下,类可能更像是参数,但是我们有IllegalArgumentException,这是一个运行时异常。
检查标准异常的理由是什么,哪些不是?
1 这是真的吗?
答案 0 :(得分:6)
明确处理我能想到的这个异常的一个原因(但这不是一个权威的答案):
尝试使用反射实例化一个类(因为该类已配置,而不是静态链接)。如果它没有预期的构造函数签名,请尝试另一个构造函数。或者另一课。任何框架代码(例如Spring)都可能具有这样的逻辑。
答案 1 :(得分:2)
从JavaDoc for InstantiationException:
应用程序尝试时抛出 使用创建类的实例 类Class中的 newInstance 方法, 但指定的类对象不能 被实例化,因为它是一个 接口或是抽象类。
这只会在使用Java反射时发生,例如:当以编程方式实例化对象时,例如ClassName.class.newInstance()
而不是new ClassName()
可以这么说。很自然地期望使用反射的人编写处理任何此类异常的代码,例如实例化抽象类或接口,或者在构造函数调用期间是否抛出异常(在这种情况下,您可以使用e.getCause()
)
预计不会在您的代码中处理 - 而是由使用反射的特定API /库处理。
答案 2 :(得分:1)
Class.newInstance()有一个关于何时抛出InstanciationException的有趣描述[javadoc]:
InstantiationException - 如果此Class表示抽象类,接口,数组类,基元类型或void;或者如果该类没有无效的构造函数;或如果实例化由于其他原因而失败。
对我而言,它似乎试图覆盖所有情况,静态链接类的实例化在编译时会失败。
最重要的部分是我突出的部分。 想象一个抛出已检查异常的构造函数。如果动态调用该构造函数会发生什么?谁会检查那个糟糕的检查异常?
答案 3 :(得分:0)
从InstantiationException javadoc的javadoc可以看出,它被抛出
当应用程序尝试创建时 使用the的类的实例 类Class中的newInstance方法,但是 指定的类对象不能 实例
你可以完美地编写这样的代码:
try {
Class myClass = Class.forName("Myclass");
myClass.newInstance();
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
不会抛出IllegalArgumentException
。
关于checked
和unchecked
,更多的是关于导致异常的原因,而不是它是否易于恢复。请详细了解checked
vs
答案 4 :(得分:0)
虽然检查和未检查的异常之间存在巨大的灰色区域,但许多异常可以说是以这种或那种方式设计的,但这种情况并非如此。这是一个错误,它应该是未经检查的。