MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

ClassNotFoundException和NoClassDefError之间的区别

Posted on 2007-04-26 15:55 leekiang 阅读(5019) 评论(4)  编辑  收藏 所属分类: java

ClassNotFoundException发生在装入阶段。
当应用程序试图通过类的字符串名称,使用常规的三种方法装入类,但却找不到指定名称的类定义时就抛出该异常。

NoClassDefFoundError: 当目前执行的类已经编译,但是找不到它的定义时

也就是说你如果编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误

加载时从外存储器找不到需要的class就出现ClassNotFoundException
连接时从内存找不到需要的class就出现NoClassDefFoundError

大概这样的吧,JDK API里面的解释
1.NoClassDefFoundError
当 Java 虚拟机或 ClassLoader 实例试图在类的定义中加载(作为通常方法调用的一部分或者作为使用 new 表达式创建的新实例的一部分),但无法找到该类的定义时,抛出此异常。
当前执行的类被编译时,所搜索的类定义存在,但无法再找到该定义。

2.ClassNotFoundException
当应用程序试图使用以下方法通过字符串名加载类时,抛出该异常:
* Class 类中的 forName 方法。
* ClassLoader 类中的 findSystemClass 方法。
* ClassLoader 类中的 loadClass 方法。
但是没有找到具有指定名称的类的定义。从 1.4 版本开始,此异常已经更新,以符合通用的异常链机制。在构造时提供并通过 getException() 方法访问的“加载类时引发的可选异常”,现在被称为原因,它可以通过 Throwable.getCause() 方法以及与上面提到的“遗留方法”来访问。

http://www.javaeye.com/topic/21141?page=1


评论

# re: ClassNotFoundException和NoClassDefError之间的区别  回复  更多评论   

2009-11-22 17:35 by 11
java.lang.NoClassDefFoundError出现的可能几种情况
1、确实有某个类不存在。
2、某个类所依赖的class或jar不存在,导致未正常加载。
3、单实例类,由于初始化出错,也会抛出该error。
4、对于有些框架,自动生成java bean的时候,如果相应的class没有提供默认构造函数,会抛此异常。

# re: ClassNotFoundException和NoClassDefError之间的区别  回复  更多评论   

2009-11-22 17:35 by 11
还有几种情况
1、类文件存在,但处于不同的Domain中,有可能无法正常加载,特别是基于OSGI的体系,这种情况很常见
2、即使一个类不是单例,如果有static{}代码,其中出错了,也无法加载

# re: ClassNotFoundException和NoClassDefError之间的区别  回复  更多评论   

2009-11-22 17:36 by 11
真的是NoClassDefFoundError吗

前两天碰到一个奇怪的问题,异常的信息就是NoClassDefFoundError,但是需要加载的类肯定是可以找得到的,最后问题的根源在于内存不足,由于产品需要加载的类非常的多,到现在我们的maxPermSize已经需要设置为128m了,而那个错误就是由于内存不足,类初始化的时候内存不足无法初始化成功导致出现 NoClassDefFoundError,这个就让我联想到原来经常遇到的类实例初始化的异常,最终报的错也是 NoClassDefFoundError,呵呵,所以,以后遇到这个异常要仔细看看后面的详细异常信息,如果是<clinit>抛出的,基本上就是初始化失败而不是真正的找不到类定义了。
http://www.jiehoo.com/%E7%9C%9F%E7%9A%84%E6%98%AFnoclassdeffounderror%E5%90%97.htm

# re: ClassNotFoundException和NoClassDefError之间的区别  回复  更多评论   

2016-01-15 17:39 by jiangzx
NoClassDefFound may indicate the class is not there, as the javadocs indicate, but it is typically thrown when, after the classloader has loaded the bytes for the class and calls "defineClass" on them. Also carefully check your full stack trace for other clues or possible "cause" Exceptions (though your particular backtrace shows none).

From: http://stackoverflow.com/questions/1401111/noclassdeffounderror-could-not-initialize-class-error

只有注册用户登录后才能发表评论。


网站导航: