关于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也是一样。
为了趟这个坑,真是杀死自己不少脑细胞啊~
322021-06-11 -
YangZki
2020-03-27
解决
解决办法就是把事务的默认隔离级别设置成 "读已提交".
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;222022-04-06 -
大周
2018-11-22
这个问题是留给大家对于链接的一个坑,要仔细想想。思路是缓存方面,不要让你的sql读取缓存里的数据。否则数据不会变
022020-01-17
相似问题