为什么InstantiationException是一个经过检查的异常?

时间:2011-06-16 08:11:01

标签: java exception instantiationexception

我的理解是,已检查的例外是那些可以合理地预期从中恢复的人。我不明白为什么这是InstantiationException的情况。如果一个类无法实例化,那么调用者应该做什么?

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

检查标准异常的理由是什么,哪些不是?

1 这是真的吗?

5 个答案:

答案 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

关于checkedunchecked,更多的是关于导致异常的原因,而不是它是否易于恢复。请详细了解checked vs

答案 4 :(得分:0)

虽然检查和未检查的异常之间存在巨大的灰色区域,但许多异常可以说是以这种或那种方式设计的,但这种情况并非如此。这是一个错误,它应该是未经检查的。