今天遇到了一个奇怪的NoClassDefFoundError错误,在Eclipse下JRE环境与classLoader都没错的情况下,很纳闷怎么会出现一般由这2个问题导致的错误.下面贴出原代码:
public class MainTest {
public static void main(String[] args) {
Session session=null;
Transaction tx=null;
try {
session=HibernateUtils.getSession();
//begin
tx=session.beginTransaction();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
finally{
HibernateUtils.closeSession(session);
}
}
}
错误信息是:
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.yan.hibernate.HibernateUtils
at com.yan.test.MainTest.main(MainTest.java:55)
这样的日志信息是非常糟糕的,往往很难一目了然的定位到错误的根源,因为它屏蔽了这个类里面发生的错误.
调试方法
我把HibernateUtils单独放在一个JUnit的测试单元里,结果立刻看到问题的根源了.
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:151)
at com.yan.hibernate.HibernateUtils.<clinit>(HibernateUtils.java:13)
at com.yan.test.MainTest.main(MainTest.java:20)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
很明显,Jar包中依赖的类没有找到,但是由于我在原程序中没有catch Error类型,导致错误无法跟踪或断链.说到这个,我想起之前公司项目中有这样的一段代码,也是因为异常捕获到之后没有正确的处理而导致跟踪不到root cause.引以为鉴.
附带几篇异常处理的文章:
http://www.ibm.com/developerworks/cn/java/j-lo-exception/index.html
http://www.ibm.com/developerworks/cn/java/j-lo-exceptionframework/