使用Mybatis出现的一个异常bug

使用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的时候,需要记得加上异常捕获,并且打印出异常堆栈,方便定位问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值