6

在 Java 中,Class.forName 是否可以返回 null,或者如果找不到该类,它是否总是抛出 ClassNotFoundException 或 NoClassDefFoundError?

4

4 回答 4

12

Java Docs 说如果找不到类,它将抛出 ClassNotFoundException,所以我会说它永远不会返回 null。

于 2009-01-09T23:09:22.513 回答
5

由于此方法的文档中的任何地方都没有提到 null ,而且似乎没有任何情况让该方法返回 null 而不是抛出异常是有意义的,我认为假设它是非常安全的从不返回 null。

它不会抛出 NoClassDefFoundError,但可能会抛出 ClassNotFoundException。

于 2009-01-09T23:09:09.473 回答
0

使用默认的类加载器,你肯定不会收到空值。但是,正如 jdigital 所说,您可能会受到任意数量的自定义类加载器的影响,具体取决于您可能正在使用的安全模型或其他类型的代理加载器(有意或无意)。

哎呀,即使 forName 也可以将 ClassLoader 作为参数... :)

皮科

于 2009-01-10T00:29:17.003 回答
-2

@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: Inner2caused by ClassNotFoundException: Inner2

于 2009-01-10T03:13:39.197 回答