为什么InstantiationException是已检查的异常



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

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

检查标准异常和不检查标准异常的原因是什么

1这是真的吗?

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

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

来自JavaDoc的InstantiationException:

当应用程序尝试使用创建类的实例类class中的newInstance方法,但是指定的类对象不能被实例化,因为它是接口或是一个抽象类

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

它不希望在代码中处理,而是由使用反射的特定API/库处理。

class.newInstance()对何时抛出InstanciationException有一个有趣的描述[javadoc]:

InstantiationException-如果该类表示抽象类、接口、数组类、基元类型或void;或者如果该类没有null构造函数;或者,如果实例化由于其他原因而失败

对我来说,它似乎试图涵盖静态链接类的实例化在编译时失败的所有情况。

不过,最重要的部分是我强调的那篇文章想象一个构造函数抛出一个已检查的异常如果动态调用该构造函数会发生什么?谁来检查那个检查不好的异常?

从InstantiationException javadoc的javadoc中可以看到,它抛出了

当应用程序尝试创建使用类class中的newInstance方法,但是指定的类对象不能实例化。

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

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

则不会抛出CCD_ 4。

关于checkedunchecked,更多的是关于异常的原因,而不是它是否易于恢复。请阅读更多关于checked与的信息

虽然检查异常和未检查异常之间存在巨大的灰色地带,而且许多异常可以这样或那样设计,但这一个不是。这是一个错误,应该加以制止。

相关内容

  • 没有找到相关文章

最新更新