我的理解是,检查的例外情况是那些呼叫者可以合理预期的恢复。我不明白为什么是这种情况与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 会被抛出。

关于 checkedunchecked 它更多的是什么原因造成的例外,而不是它是否很容易从中恢复,或者没有。请解更多关于 checked vs

虽然检查和未检查的异常之间有很大的灰色区域,并且可以说可以以一种或另一种方式设计许多异常,但事实并非如此。这是一个错误,应该检查一下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top