在 Java 中,Class.forName 是否可以返回 null,或者如果找不到该类,它是否总是抛出 ClassNotFoundException 或 NoClassDefFoundError?
4 回答
Java Docs 说如果找不到类,它将抛出 ClassNotFoundException,所以我会说它永远不会返回 null。
由于此方法的文档中的任何地方都没有提到 null ,而且似乎没有任何情况让该方法返回 null 而不是抛出异常是有意义的,我认为假设它是非常安全的从不返回 null。
它不会抛出 NoClassDefFoundError,但可能会抛出 ClassNotFoundException。
使用默认的类加载器,你肯定不会收到空值。但是,正如 jdigital 所说,您可能会受到任意数量的自定义类加载器的影响,具体取决于您可能正在使用的安全模型或其他类型的代理加载器(有意或无意)。
哎呀,即使 forName 也可以将 ClassLoader 作为参数... :)
皮科
@Dan Dyer 错了, Class.forName可以throw NoClassDefFoundError
,如果它尝试的类在其静态初始化程序中出现 ClassNotFoundException 错误。以下是unte
class Outer {
public static final void main(final String[] args) throws Exception{
Class.forName("Inner");
}
}
如果你在没有其他文件的目录中编译并运行它,你会得到ClassNotFoundException: Inner
现在将以下内容添加到同一目录中,编译所有内容并java Outer
查看它运行正常。
class Inner {
static Inner2 _i2 = new Inner2();
}
class Inner2 {}
最后,删除Inner2.class并重新运行Outer,你会得到NoClassDefFoundError: Inner2
,caused by ClassNotFoundException: Inner2