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

在Java中,Class.forName是否可以返回null?,java,classloader,Java,Classloader,在Java中,Class.forName是否会返回null,或者如果找不到该类,它是否会始终抛出ClassNotFoundException或NoClassDefFoundError 由于该方法的文档中没有提到null,而且似乎没有任何情况下该方法返回null而不是抛出异常是有意义的,因此我认为假设它从不返回null是非常安全的 它不会抛出NoClassDefFoundError,但可能抛出ClassNotFoundException。Java文档说,如果找不到该类,它将抛出ClassNotFo

在Java中,Class.forName是否会返回null,或者如果找不到该类,它是否会始终抛出ClassNotFoundException或NoClassDefFoundError

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


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

Java文档说,如果找不到该类,它将抛出ClassNotFoundException,因此我认为它不会返回null。

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

见鬼,甚至forName也可以将类加载器作为参数…:)


Piko

@Dan Dyer出错,如果尝试的类在其静态初始值设定器中获得ClassNotFoundException错误,则Class.forName可以抛出
NoClassDefFoundError
。以下是unte

class Outer {
  public static final void main(final String[] args) throws Exception{
    Class.forName("Inner");
  }
}
如果在没有其他文件的目录中编译并运行此文件,则会得到
ClassNotFoundException:Inner

现在将以下内容添加到同一个目录中,编译所有内容并
javaouter
一次,以查看它是否正常运行

class Inner {
  static Inner2 _i2 = new Inner2();
}

class Inner2 {}

最后,删除Inner2.class并重新运行Outer,您将得到
NoClassDefFoundError:Inner2
,这是由ClassNotFoundException:Inner2

引起的,为什么它不会抛出一个NCDFError?它已经抛出ClassNotFoundException,如果同时使用这两个选项,会让人困惑。当VM在正常操作过程中找不到类时,会抛出NoClassDefFoundError。当使用反射的代码找不到类时,会抛出ClassNotFoundException。这不完全正确。Class.forName确实抛出NCDFE,请参见下面我的回答。@Hermal:不,它没有;JVM在您的示例中抛出它,试图从“正常”引用(非反射)解析类;它只是碰巧通过Class.forName()进行渗透。任何方法都可以看到NCDFError通过它。如果您使用的是自定义类加载器呢?那么自定义类加载器正在破坏契约。您必须决定是否要为该意外事件编写代码。类似地,如果您使用的是AOP运行时top,请重写现有类,如classloader:-)@达伦:你指的是哪份合同?@Hemal on达伦:返回ClassNotFoundException。不知道我遗漏了什么。您是指
Class.forName抛出CNFE
?但这并不意味着它不能返回null,也不意味着它不能抛出其他未检查的异常这个答案只适用于一个类加载器,它打破了它的文档约定——我不会为此而费心编码;JVM在您的示例中抛出它,试图从“正常”引用(非反射)解析类;它只是碰巧通过Class.forName()进行渗透。任何方法都可以看到NCDFError通过它。Hmmm。是的,我明白你的意思。这就像说Class.forName抛出NPE或OOME,因为要加载的类将它抛出到它的clinit中。“Dan Dyer是错的”不是回答Phil问题的好方法。是的,这应该是对Dan答案的评论。但我想格式化代码,所以我使用了一个单独的条目。当然,我说丹错了是错的。看看好处:作为奖金,我也得到了一些反对票:-)