今天出现一个错误,花了我3个小时,最后发现错在了这:
if (fs!=null&&fs.getId()>0)和if (fs!=null)的区别:
这样会出错:不会执行if-else的代码
/** * 关注用户 * @param follow * @return */ @RequestMapping(value = "/followUser",produces="text/html;charset=UTF-8;") @ResponseBody public String followUser(Follow follow){ System.out.println("关注用户:"+follow.toString()); //查询用户是否已经关注 Follow fs=followService.findFollow(follow); String result=null; //如果已经关注,点击变为取消关注,删除记录 if (fs!=null&&fs.getId()>0){ System.out.println("已经关注:"); followService.deleteFollow(fs.getId()); result="关注"; }else{ //没有关注,直接添加关注记录 System.out.println("没有关注:"); followService.insertFollow(follow); result="已关注"; } return ""+result; }
但把改成:就不会出错,代码可以根据if-else情况执行。
if (fs!=null){ System.out.println("已经关注:"); followService.deleteFollow(fs.getId()); result="关注"; }else{ //没有关注,直接添加关注记录 System.out.println("没有关注:"); followService.insertFollow(follow); result="已关注"; }
原因是:对象不为null不是所有属性都有值,而是至少有一个属性有值,所以fs不为null,但fs的id为null呢,这样getid()就会报空指针了。又由于id是数据库设置为主键,不允许为null的,所以即使
Follow fs=followService.findFollow(follow);
没有值,是不是返回的对象都不是null呢,但对象且没有值。
Why:为什么我会花了3个小时,才发现这个问题呢?
是因为:这个没错。
/** * 处理用户点赞行为 * @param niceDetail * @return */ @RequestMapping("/niceDetail") @ResponseBody public String niceDetail(NiceDetail niceDetail ){ System.out.println("点赞模块:"+niceDetail.toString()); //查询是否有该用户的点赞记录 NiceDetail niceDetail1=niceDetailService.findNiceDetail(niceDetail); int result=0; if (niceDetail1!=null&&niceDetail1.getContentId()>0){ System.out.println("有该记录"); //如果找到这条记录,删除该记录,同时文章的点赞数减一 //删除记录 niceDetailService.deleteNiceDetail(niceDetail1.getId()); //根据点赞id找到文章 Content content=contentService.selectContent(niceDetail1.getContentid()); //文章点赞数减一 content.setNice(content.getNice()-1); result=content.getNice(); System.out.println("res:"+result); //更新文章点赞数 contentService.updateContent(content); }else{ //如果没有找到这条记录,则添加这条记录,同时文章数加一; //添加记录 System.out.println("没有记录:"); niceDetailService.insertNiceDetail(niceDetail); Content content=contentService.selectContent(niceDetail.getContentid()); //文章点赞数加一 content.setNice(content.getNice()+1); result=content.getNice(); System.out.println("res:"+result); //更新文章点赞数 contentService.updateContent(content); } return ""+result; }那为什么这个
if (niceDetail1!=null&&niceDetail1.getContentId()>0)
就不报错呢?
现在看来:1.可能是当初数据库本身有值,所以返回的对象是真的有值,2.是该表的contentId不是主键,所以其没有不允许为null,而且是int型,所以可能if出错,也会执行else.
所以最后发现自己之所以花了3个小时是因为被这个给坑住了,之前排错就没往这方面去想,而且有了成功运行的案例,就本能的觉得没有错啊,所以一般只认为是数据传不到,mapper写错sql,结果是if语句出的错。
所以总结:不要被自己挖的坑坑了,要细心,要跳出框,不要给自己挖坑,逻辑要严密点。
我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。