关于13-7中的空指针错误

来源:13-7 常见问题及解决(一)

小白求学

2018-11-22

老师在视频中给出的解释是因为UserManager中的代码还没有执行完,就开始执行给User对象赋值,所以会报空指针。解决方法是等待几秒钟再执行User那句。我在自己本地运行却不行,无论等待多少秒也都会报空指针。经过多次试验发现:

第一次执行时会报空指针,然后不需要修改任何代码,再运行一次就能顺利通过。以updateUserInfo为例:user 表中原有n条用户记录,updateUserInfoCase表中有一条新用户记录,该记录在user表中不存在。UpdateUserInfoTest这条用例的功能是从updateUserInfoCase表中取出数据,用以更新到user表中id相同的那一条。第一次执行时,getResult方法让user表成功被更新了。但 User user = session.selectOne这条语句执行后报了空指针。无论前面加多少秒也没用。
然后什么都不修改,直接执行第二遍,这次就一定会通过。而第二次执行时,user表里已经有和updateUserInfoCase表中一模一样的数据了(因为第一次执行时已经把user表更新过了)。但如果第二次执行前把user表改回未更新之前的数据,那么还是会报空指针错。

代码是跟着老师的视频同步敲的,之后也同下载的课堂代码对照过,应该没有错。但是不知道为什么会这样。因为如果执行两遍才通过的话,那这种更新功能也就没意义了。addUser用例也是同样的情况。

麻烦老师给分析一下,谢谢!

写回答

3回答

小白求学

提问者

2018-11-23

耗费两天多,终于解决了!看了几遍视频,发现老师视频上最后一次运行会通过是因为第一次执行时user表已经被更新过了,并没有修改回原始表,那么再一次执行必然通过。之后老师给出的思路是缓存问题。尽管我设置了缓存还是不起作用,可能设置的方法不对。之后想了个笨办法,在mysql.xml加了一个select语句,把user指定的记录查出来。经试验,执行getResult方法后,查询user表应该被更新的记录,该记录仍是原来的数据,没有得到更新。于是笨办法来了:

新起一个sqlsession

SqlSession session2 = DatabaseUtil.getSqlSession(); 

User user = session2.selectOne("addUser",addUserCase);

这样一来读取的就是更新过的user表,再也不会报空指针错了。也不用先执行一遍再执行第二遍了。对于updateUserInfoCase也是一样。

为了趟这个坑,真是杀死自己不少脑细胞啊~

3
2
cloudonthesun
我也是这么解决的
2021-06-11
共2条回复

YangZki

2020-03-27

解决
解决办法就是把事务的默认隔离级别设置成 "读已提交".
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

2
2
weixin_慕妹7355100
谢谢,此方法可行
2022-04-06
共2条回复

大周

2018-11-22

这个问题是留给大家对于链接的一个坑,要仔细想想。思路是缓存方面,不要让你的sql读取缓存里的数据。否则数据不会变

0
2
YangZki
回复
小白求学
解决 解决办法就是把事务的默认隔离级别设置成 "读已提交". mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
2020-01-17
共2条回复

Java接口自动化测试实战,搞定理论基础+典型应用场景

打破传统测试用例设计方法,搞懂基于TestNG的接口自动化测试技术

2086 学习 · 920 问题

查看课程