请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

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

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

正在回答 回答被采纳积分+3

3回答

提问者 小白求学 2018-11-23 11:43:25

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

新起一个sqlsession

SqlSession session2 = DatabaseUtil.getSqlSession(); 

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

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

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

3 回复 有任何疑惑可以回复我~
  • 正在坑中,尝试关闭了一二级缓存依然无效
    回复 有任何疑惑可以回复我~ 2019-10-08 11:04:52
  • 我也是这么解决的
    回复 有任何疑惑可以回复我~ 2021-06-11 16:42:13
YangZki 2020-03-27 23:40:50

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

2 回复 有任何疑惑可以回复我~
大周 2018-11-22 22:39:18

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

0 回复 有任何疑惑可以回复我~
  • 提问者 小白求学 #1
    老师,我网上查了一些控制缓存的方法,例如mysql.xml里加入flush cache = "true" use cache = "false", 但是不管用。能不能给出答案啊?
    回复 有任何疑惑可以回复我~ 2018-11-23 09:33:41
  • YangZki 回复 提问者 小白求学 #2
    解决
    解决办法就是把事务的默认隔离级别设置成 "读已提交".
    mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
    回复 有任何疑惑可以回复我~ 2020-01-17 17:31:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信