Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么实例化异常是选中的异常?_Java_Exception_Instantiationexception - Fatal编程技术网

Java 为什么实例化异常是选中的异常?

Java 为什么实例化异常是选中的异常?,java,exception,instantiationexception,Java,Exception,Instantiationexception,我的理解是,已检查异常是可以合理预期的调用方可以从中恢复的异常。我不明白为什么实例化异常会出现这种情况。如果一个类不能被实例化,那么调用方应该做什么 然后我认为代码编译可能是一个重要的考虑因素,因此只有动态指定类时才会发生这种情况。1在这种情况下,类可能更像一个参数,但我们有一个运行时异常IllegalArgumentException 检查标准异常和不检查标准异常背后的理性是什么 1这是真的吗?我可以想到明确处理此异常的一个原因(但这不是一个权威的答案): 尝试用反射实例化一个类(因为该类是配

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

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

检查标准异常和不检查标准异常背后的理性是什么


1这是真的吗?

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


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

来自JavaDoc for InstanceionException:

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

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

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

Class.newInstance()对何时引发InstanceException有一个有趣的描述:

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

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


最重要的部分是我强调的那一部分想象一个构造函数抛出一个选中的异常。如果动态调用该构造函数会发生什么?谁来检查这个糟糕的检查异常?

正如您从的javadoc中看到的,它被抛出了

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

您完全可以编写这样的代码:

try {
Class myClass = Class.forName("Myclass");
myClass.newInstance();
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
不会引发任何
IllegalArgumentException


关于
已选中
未选中
更多的是关于导致异常的原因,而不是异常是否易于恢复。请阅读更多关于检查的vs

检查和未检查的异常之间有一个巨大的灰色区域,许多异常可以这样或那样设计,但这一个不是。这是一个错误,应该取消检查。

这不正确。试试看。您将得到构造函数引发的实际(已检查!)异常。。。这在JavaI中是可能的。正是java.lang.reflect.Constructor.newInstance()实现了我所说的。尽管如此,instanceionException还是被选中的,因为它被用来传播被选中的异常(除其他外)。Class.newInstance()实际上使用该事实以不安全的方式重新显示构造函数的检查异常。很好,我没有想到
constructor.newInstance()
Class.newInstance()
之间的细微差别。。。