转载本文请联系Java极客技术公众号。阿芬工作这么久,没想到自己会被同事写的一个接口返回的异常空指针折磨死。她被活活折磨死了,但她根本不知道原因。你有过这样的经历吗?NullPointerException这个标题很扎眼,告诉大家,这个空指针异常,说实话,在项目中很多都很好解决,但是有时候问题的原因是你怎么也想不到,事情是这样的。前端代码如下:varsetting={url:"findFileById",data:{id:id},success:function(data){console.log(data);},error:function(data){console.log("查询文件异常")}}ajax(setting);ajax只是一个包函数ajax(setting){$.ajax({type:"post",url:setting.url+".do",dataType:setting.dataType||"json",contentType:"application/json;utf-8",data:JSON.stringify(setting.data)||{},async:setting.async,success:function(data){setting.success(data);},error:function(data){setting.error("接口错误,请重试");}})后台业务处理如下:@PostMapping("findFileById")@ResponseBodypublicFilefindFileById(HttpServletRequestrequest,HttpServletResponseresponse,@RequestBodyMapmap){returndeliverFileService.findFileById(request,map);}大家肯定会说这么简单的事情你都不知道怎么做,在代码中同事没有完全处理空值的问题,导致ajax一直出现“接口错误,请重试”的错误。问题是他没有处理空数据,而是直接返回给我。这种问题也很奇怪。很多时候不是需要处理空数据来防止NULL异常吗?而阿芬也是不一会儿第一个找到他的,他说没事。我从他那里正常打电话,当时我很尴尬。我传给你的参数没问题。如果查询数据为空,应该有提示。所以阿芬只能简单修改自己的代码,变成@PostMapping("findFileById")@ResponseBodypublicFilefindFileById(HttpServletRequestrequest,HttpServletResponseresponse,@RequestBodyMapmap){returndeliverFileService.findFileById(request,map)!=null?deliverFileService.findFileById(request,map):new;newDeliverFile();}阿芬不能给他改太多,他只能改成我这边的电话。如果是null,就返回一个空对象给我,如果不是,就把查询返回的数据完整的返回给我。那么现在阿芬就来说说我们的空值问题是怎么处理的。不然以后你写好了数据接口给别人调用,调用的是空字符串还好,但是如果像null这样的不处理,就会被人鄙视被他人死亡。空指针异常问题如何处理NullPointerException什么时候出现?我们都知道NullPointerException继承了RuntimeException,也就是运行时会出现的异常信息。我们在写代码的时候,如果代码运行的时候,我们使用的对象没有初始化,或者为空的时候,就会出现空指针异常,而这个异常也是我们感觉到的最低最不可能发生的异常,但它往往是因为我们自己的不注意而出现的。其实这样的方法太多了,很多时候我们并没有关注这件事,比如对象,它判断null操作,但是如果你在每个对象使用的时候都判断null,那你的代码就真的会出现:if(a!=null){if(b!=null){if(c!=null){....}}}看到这种代码,第一感觉是有没有我就是想把这个朋友拉过来揍我一顿。这种写多了,人会发疯的,尤其是二级维修人员。其实这种方法虽然笨,但也算是一种习惯。判断null值在功能上肯定不会造成很大的麻烦,但是这样的null值也是很折磨人的,还是处理一下吧。1、先不说这个,只判断对象是否为空。二是比较equals方法的时候,我们的书写习惯往往是这种if(text.equals("xxxxx")){}这种比较其实没有问题,但是大家有没有想过if是你的文字是空的?你是不是比较错了?而且曾经有个面试官问我为什么在笔试题前面写knownstring。可能那时候只是习惯,后来发现这个真的好用滴。如果改成:if("xxxxx".equals(text)){},就可以避免空指针的错误。这不是一个好习惯吗?第三个,也是我们在Java8中提供的特性OptionalofNullable,在Optional中提供,传递我们需要判断是否为空的参数。对于集合,可以使用之前修改的方法判断是否为null。如果为null,那我们就必须返回一个连空的对象,或者一个空的集合,这样对于后续调用你的接口的人也很友好。我知道很多人会说,那我在接口上写个注释,查询返回的值可能为空,大家调用慎重,虽然你提示了问题,但是你没有解决问题,比较所以,你抛出了所有的异常,却没有对付他。这个时候我们也可以使用Java8中提供的Optional,比如这个OptionalgetProductOptional(Stringid)这个时候,当我们的调用者知道了Optional的存在,自然而然就会明白了。你有什么其他好的方法来处理null吗?