在Java中,Class.forName可以返回null吗?

时间:2009-01-09 23:05:47

标签: java classloader

在Java中,Class.forName是否会返回null,或者如果无法找到类,它是否会抛出ClassNotFoundException或NoClassDefFoundError?

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

由于在这个方法的文档中没有提到null,并且因为似乎没有任何情况使得该方法返回null而不是抛出异常是有意义的,我认为它是非常安全的假设它永远不会返回null。

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

答案 2 :(得分:0)

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

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

Piko的

答案 3 :(得分:-2)

@Dan Dyer错误,Class.forName 可以抛出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