为什么是InstantiationException一个检查异常?
-
28-10-2019 - |
题
我的理解是,检查的例外情况是那些呼叫者可以合理预期的恢复。我不明白为什么是这种情况与InstantiationException.如果一类无法实例,然后是什么来电望做什么?
然后我想,也许这是一个重要的考虑,代码汇编了-因此这可能只发生,如果一类是动态的规定。1 在这种情况下的类可能更喜欢一个参数,但我们必须IllegalArgumentException这是一个运行异常。
什么是合理的后面,标准的例外检查,哪些不是?
1 这是真的吗?
解决方案
我可以想到的显式处理此异常的一个原因(但这不是权威性的答案):
尝试通过反射实例化一个类(因为该类已配置,而不是静态链接)。如果没有预期的构造函数签名,请尝试其他构造函数。或其他课程。任何框架代码(例如Spring)都可能具有这种逻辑。
其他提示
从JavaDoc中获取InstantiationException:
应用程序尝试执行以下操作时抛出 使用创建一个类的实例 Class类中的 newInstance 方法, 但是指定的类对象无法 被实例化,因为它是一个 接口还是抽象类。
这只会在使用Java反射时发生,例如以编程方式实例化对象时,例如可以说,
ClassName.class.newInstance()
与new ClassName()
相反。我们很自然地希望有人使用反射来编写处理任何此类异常的代码,例如实例化抽象类或接口,或者在构造函数调用期间抛出异常(在这种情况下,您可以使用e.getCause()
)。它不应在您的代码中处理-而是由使用反射的特定API /库处理。
Class.newInstance()对何时引发InstanciationException进行了有趣的描述 [javadoc] :
InstantiationException-如果此Class表示一个抽象类,一个接口,一个数组类,一个原始类型或void;或如果类没有空构造函数;或者或如果实例由于其他原因而失败。
在我看来,它试图涵盖所有情况下静态链接类的实例化在编译时会失败。
最重要的部分是我突出显示的部分。想象一个抛出检查异常的构造函数。如果动态调用该构造函数会怎样?谁来检查那个不良的检查异常?
正如你可以看到,如果是的话,为什么不试的 InstantiationException如果是的话,为什么不试, 它扔
当一个应用程序试图创建一个 类实例的使用 newInstance方法在类,但是 指定的类对象不能 实例化。
你完全可以写这些代码:
try {
Class myClass = Class.forName("Myclass");
myClass.newInstance();
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
没有 IllegalArgumentException
会被抛出。
关于 checked
和 unchecked
它更多的是什么原因造成的例外,而不是它是否很容易从中恢复,或者没有。请解更多关于 checked
vs
虽然检查和未检查的异常之间有很大的灰色区域,并且可以说可以以一种或另一种方式设计许多异常,但事实并非如此。这是一个错误,应该检查一下。