专栏首页小小码农一个。Mybatis selectOne查询空指针异常NullPointerException

Mybatis selectOne查询空指针异常NullPointerException

为什么selectOne会报空指针异常?又如何解决?

假设有如下方法:

	public User selectUserByUsername(String username){
		DBAccess dbAccess = new DBAccess();//DBAccess是用于获取sqlSession的类
		SqlSession sqlSession = null;
		try {
            User user = new User();
			sqlSession = dbAccess.getSqlSession();
			user =  sqlSession.selectOne("User.selectUserByUsername", username);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(sqlSession != null){
				sqlSession.close();
			}
		}
		return user;
	}

上述代码在进行查询的时候如果没有查询到任何值,那么selectOne会返回null,并把null赋值给user对象。这样赋值的时候是不会报错的也不会有任何异常,但是当一个对象为null的时候,是不可以调用其get方法的,会出现空指针异常:

但是将null赋值给user对象的情况和不给user的任何属性set任何值的情况不一样:

可以看到,当user对象被创建出来的时候并不是null的,因此调用其get方法时会根据属性类型返回其初始值。

因此,在使用Mybatis进行查询(即使是查询单条结果)的时候,更推荐将查询结果使用List封装,用selectList方法来进行查询,好处是可以直接使用List的isEmpty方法和size方法来进行判断,并且可以避免空指针异常的麻烦。

解决

	public List<User> selectUserByUsername(String username){
		List<User> userList = new ArrayList<User>();
		DBAccess dbAccess = new DBAccess();
		SqlSession sqlSession = null;
		try {
			sqlSession = dbAccess.getSqlSession();
			userList =  sqlSession.selectList("User.selectUserByUsername", username);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(sqlSession != null){
				sqlSession.close();
			}
		}
		return userList;
	}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java8StreamAPI实例

    filter内部使用的是lamda表达式,也是Java8的功能,o代表集合中每一个元素,o>5表示这个元素的值若大于5就返回true,就获取结果。collect...

    崔笑颜
  • HashMap内部

    让我们点击HashMap<String,String> map = new HashMap<>();看看内部发生了什么。

    崔笑颜
  • SpringBoot整合

    崔笑颜
  • 旅游网项目总结1

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡
  • Linux 基础优化配置

    在安装完成Linux系统之后,我们是需要进行一些优化,使操作系统更加的安全,同样也是一些必备的准备工作(为日后的生产环境)

    民工哥
  • vue加载优化(全)

    程序员不务正业
  • 优秀博客文章 | javascript跨域方法总结

    最近面试问的挺多的一个问题,就是JavaScript的跨域问题。在这里,对跨域的一些方法做个总结。由于浏览器的同源策略,不同域名、不同端口、不同协议都会构成跨域...

    用户1467662
  • KVO 正确使用姿势进阶及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里

    你要知道的KVC、KVO、Delegate、Notification都在这里 转载请注明出处 https://cloud.tencent.com/develop...

    WWWWDotPNG
  • 腾讯开源国际化新突破,将紧密参与全球开源治理

    ? 近日,腾讯正式加入Linux基金会旗下TODO工作组(TODO Group)(https://todogroup.org/),这标志着腾讯开源将进一步与国...

    腾讯技术工程官方号
  • GitHub封杀一键脱衣应用后,我在热榜上找到一个安卓版

    现在,无论是个人上创建的相关开源项目,还是DeepNude创建者的项目,都已经被GitHub官方404。

    量子位

扫码关注云+社区

领取腾讯云代金券