关于NoClassDefFoundError和ClassNotFoundException异常_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 关于NoClassDefFoundError和ClassNotFoundException异常

关于NoClassDefFoundError和ClassNotFoundException异常

 2013/8/4 4:08:29  wxl24life  程序员俱乐部  我要评论(0)
  • 摘要:java.lang.NoClassDefFoundError和java.lang.ClassNotFoundException都是Java语言定义的标准异常,准确的说,它们都是runtimeexception(也称作uncheckedexception)。将这两个异常放在一起很容易分辨他们是两个不同的异常,但是如果在实际运行代码时碰到了其中一个,这两个异常很容易被混淆成同一个,尤其是当事先没有在意过这两个异常的差别时。就我个人而言,在这两个异常里,平时碰到最多的是java.lang
  • 标签:not SSD 异常 class

?

java.lang.NoClassDefFoundError 和 java.lang.ClassNotFoundException 都是 Java 语言定义的标准异常,准确的说,它们都是 runtime exception(也称作 unchecked exception)。

?

将这两个异常放在一起很容易分辨他们是两个不同的异常,但是如果在实际运行代码时碰到了其中一个,这两个异常很容易被混淆成同一个,尤其是当事先没有在意过这两个异常的差别时。

?

就我个人而言,在这两个异常里,平时碰到最多的是?java.lang.ClassNotFoundException,从异常的名字看,很容易理解这个异常产生的原因是缺少了 .class 文件,比如少引了某个 jar,解决方法通常需要检查一下 classpath 下能不能找到包含缺失 .class 文件的 jar。

?

但是,很多人在碰到?java.lang.NoClassDefFoundError 异常时也会下意识的去检查是不是缺少了 .class 文件,比如 SO 上的这位提问者(java.lang.NoClassDefFoundError: Could not initialize class XXX)-- “明明 classpath 下有那个 jar 为什么还报这个异常“。而实际上,这个异常的来源根本不是因为缺少 .class 文件。在这个提问下面的回答里可以找到真正的原因是

写道 The ClassLoader ran into an error while reading the class definition when trying to read the class.

?

即类加载器在加载这个类定义的时候报错了。所以,应该检查这个类初始化部分(如类属性定义、static 块等)的代码是否有抛异常的可能,如果是 static 块,可以考虑在其中将异常捕获并打印堆栈等。

?

----------------

前两天我也碰到了一个类似场景导致的?java.lang.NoClassDefFoundError: Could not initialize class xxx 异常,下面详细记录一下。

?

我定义了一个类,为了使用 log4j 打印日志,调用 org.slf4j.LoggerFactory 创建了一个 Logger,并作为类的 static 属性,除此之外无其他的成员属性,代码如下:

?

public class Foo {
    private static Logger logger = LoggerFactory.getLogger(Foo.class);
    // ... methods
}

?

在另一个类里创建 Foo 实例:

?

public class Bar {

     public void someMethod() {
         Foo foo = new Foo();
         // ...
    }
}

?

在执行 new Foo() 时抛异常?java.lang.NoClassDefFoundError: Could not initialize class Foo。经过一番排查,这个异常最后的原因出在了 LoggerFactory.getLogger(Foo.class) ?调用抛错,关于 这条语句为什么会抛错,我会在另一篇文章里详细描述,在这里只是简单的说下原因:由于 slf4j-api.jar 和 slf4j 的某个 binding jar 版本不兼容所致。

?

----

总结,记住他们是两个不同的异常类,在碰到具体某个异常时,从名字并联系它的 message 信息(如 "Could not initialize class?")就很容易锁定问题来源。

?

完。

上一篇: 链表总结 下一篇: 没有下一篇了!
发表评论
用户名: 匿名