使用Mybatis这个ORM框架进行查询操作的时候,没有任何编译错误,也没有异常抛出,但运行查询的时候,会发现以下错误。
java.lang.NoClassDefFoundError: Could not initialize class org.smart4j.chapter2.service.FmSqlSessionBuilderManager
java.lang.NoClassDefFoundError,注意这个错误和
ClassNotFoundException是不一样的,后者是指类在工程中没有定义,但是前者不是,前者更多的是:
ClassLoader加载类的时候出现了没有被捕获的异常。,这种异常一般是运行时异常。
查看自己写的代码和源码可以发现,使用SqlSessionBuilder加载mybatis的xml配置文件的时候,有一个运行时异常。
SqlSessionFactoryBuilder.java 源码
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
ExceptionFactory.java的源码
public static RuntimeException wrapException(String message, Exception e) {
return new PersistenceException(ErrorContext.instance().message(message).cause(e).toString(), e); }
在加载xml的时候,虽然捕获了异常,但是也抛出了这个PersistenceException异常,但是在调用
new SqlSessionFactoryBuilder().build(inputStream);
这个接口的时候,没有捕获运行时异常,也没有异常堆栈打印,在类加载的时候出现,但是也看不到异常在哪。所以下次对于加载mybatis的xml文件,创建SqlSession的时候,需要记得加上异常捕获,并且打印出异常堆栈,方便定位问题。