毫无疑问,空指针NullpointerException是我们最常遇到异常,没有之一!

在刚进入编程职业时,我想,大部分进入的同学肯定会受到前辈们的叮咛:一定要防止空指针,这是个低级错误。你们不是?好吧,反正我是这样~

于是乎,在每一个方法中,无论是接收到的参数还是通过其他方法得到的结果,我都会进行空指针判断,诸如:

  public boolean isValid(String code){
if(StringUtils.isBlank(code)){
.....
}
.....
}

抑或:

  public boolean isValid(String code){
....
User user= userManager.find(code);
if(user==null){
....
}
}

这样并没有错误不是吗?极大程度上可以预防空指针NullpointerException的发生。

按照这种方式,疯狂地防止NullpointerException一段时间后,因为业务需要,在已经实现的业务中修改业务逻辑,突然觉得到处都是if防止空指针代码,原本简短的业务逻辑代码隐藏在了这种防止空指针代码中,有点像电视剧放广告:以前是电视剧中插播广告,现在是广告中插播电视剧。

总之,自己写的代码都看的有些晕乎乎,但是,这样做是没错,我也很无奈啊!

经过一段时间,review别人写的代码以及参考一些框架源码,我开始问自己一个问题:NullpointerException真的一定需要被处理吗?或者说所有的NullpointerException都需要被自己处理吗?

答案显然是否定的!

就拿上面的代码作为例子,第一种情况,如果code为null,经过判断后返回false,第二种情况,code存在,但是user不存在,同样返回false。

这样的逻辑并没有问题对吧,至少对于这个方法并没有问题,除了多了一些判空语句。

假设我们去除上面代码中关于code的判空,并且假设find方法中有对code的处理:按code中的“#”split分成数组。

那么当code为null传入isValid方法中,因为find方法使用了code的split方法,会报出空指针异常NullpointerException。

我们稍微思考下,这里的NullpointerException会给方法调用方带去什么影响:方法调用方将知道code是必选的参数,不能为null。

这样,那方法调用方自己控制传入的参数不能为null就好了,或者自己加上try/catch处理,isValid有自己的逻辑需要实现,既然你调用我,那么就需要满足我的要求,而不是我适应方法调用方的需求!

可能例子举的有些抽象,我整理下主要思想:

  1. 对于传入的参数,方法非底层方法,那么只按照自己认定的方式处理。比如我就认为这个参数不为null,并且后续的处理方式有代码必须要求该参数不可为空,如果为null就会抛出NullpointerException,然后只需要按照不为null的方式处理,不会判断是否为null;
  2. 同样对于传入的参数,如果方法已经是底层的方法,对该参数不会有不为null的要求,那就需要该方法进行相应空指针判断了,因为你需要抛出对应的异常信息;
  3. 如果是调用其他方法得到的结果,如果一定需要不为null的,那么就需要判空,因为你同样需要抛出对应的异常信息;

可以利用爱情公寓中一句经典台词来记忆:跟我赌,不是看你要什么而是看我有什么。

放在这,可以改成:有求我,不是看你有什么,而是看我要什么

这样做可以明显减少这些让人不甚厌烦的判空语句,更好的展现实际的业务逻辑,更易进行维护!!!

思想一例子:

   public boolean isValid(String code){
String[] arr=code.split("#");
....
}

思想二例子(底层,mybatis按照code查询user):

      if(StringUtils.isBlank(code)){
throw new NullPointerException("code不可为空");
}
User user=userMapper.findByCode(code);
....
}

作者: 风语
因水平限制,本人观点难免会有错误疏漏,如发现有什么不妥或者有更好的建议或意见,还请各位不吝赐教!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(1475958950@qq.com)咨询。

NullpointerException真的一定要被预防?的更多相关文章

  1. NullpointerException处理

    毫无疑问,空指针NullpointerException是我们最常遇到异常,没有之一! 在刚进入编程职业时,我想,大部分刚进入的同学肯定会受到前辈们的叮咛:一定要防止空指针,这是个低级错误.你们不是? ...

  2. android( java) 处理 null 和 预防空指针异常(NullPointerException) 的一些经验。

    概述: 在实际编码中总是会遇到 空指针异常 ,本文总结了一些处理空指针的个人经验. 原则: 尽早的检查,尽早的失败. 比如: 通过intent传参到新的目标 activity,而且一定需要这个参数,那 ...

  3. NullPointerException的处理新方式,Java14真的太香了

    在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25.最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPoint ...

  4. 关于WannaCry病毒的见解与预防,我有话说!

    好久没写博客了,自从定性专做技术扩展服务后,已经有两年半没有正式写过博客,要不是这次WannaCry病毒的厉害程度,我也懒得去写博客,为什么呢?写技术文章吗?两年多没有研究新的技术,没有什么好写的!所 ...

  5. 你真的会阅读Java的异常信息吗?

    给出如下异常信息: java.lang.RuntimeException: level 2 exception at com.msh.demo.exceptionStack.Test.fun2(Tes ...

  6. AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。

    开篇三问 AJAX请求真的不安全么? AJAX请求哪里不安全? 怎么样让AJAX请求更安全? 前言 本文包含的内容较多,包括AJAX,CORS,XSS,CSRF等内容,要完整的看完并理解需要付出一定的 ...

  7. dubbo 使用zookeeper 出现 Dubbo客户端调用报错NullPointerException

    现在将网上的方法总结一下 方法一:.https://blog.csdn.net/u011294519/article/details/81810631 dubbo-provider.xml:提供者先扫 ...

  8. java.lang.NullPointerException - 如何处理空指针异常

    当应用程序试图null在需要对象的情况下使用时抛出.这些包括: 调用null对象的实例方法. 访问或修改null对象的字段. 把长度null当作一个数组. 像访问或修改null阵列一样访问或修改插槽. ...

  9. [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

    可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...

随机推荐

  1. 鼠标移动或者鼠标点击div消失不见排查

    点击事件,导致某div或者容器样式隐藏,如果不能直接发现click事件绑定,那么首先排查哪些方法在控制div的样式, 然后看一看哪些方法在调用修改样式的方法. 然后再排查什么在调用修改样式的方法的方法 ...

  2. java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment问题解决

    2018-09-29 17:45:16.905 ERROR [pool-1-thread-1]o.s.scheduling.support.TaskUtils$LoggingErrorHandler. ...

  3. 02-JSON

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. 【Luogu】P1941飞扬的小鸟(DP)

    我发现现在没了题解我做普及提高+的题也做不了 更不要说这些提高+难度的‍题 此题是一个二维DP.暴力是三重循环ijk,k枚举在i位置上的点击次数.即 for(int i=1;i<=n;++i) ...

  5. POJ 1286 Necklace of Beads ——Burnside

    [题目分析] 题目大意:一个环有n个点,共染三种颜色.问 在旋转和对称的情况下有多少种本质不同的方案数. Burnside直接做. [代码] #include <cstdio> #incl ...

  6. 转载: GMM-HMM学习笔记

    转载地址:http://blog.csdn.net/davidie/article/details/46929269 最近几天钻研了语音处理中的GMM-HMM模型,阅读了一些技术博客和学术论文,总算是 ...

  7. java面试题之Thread的run()和start()方法有什么区别

    run()方法: 是在主线程中执行方法,和调用普通方法一样:(按顺序执行,同步执行) start()方法: 是创建了新的线程,在新的线程中执行:(异步执行) public class App { pu ...

  8. bzoj3609 [Heoi2014]人人尽说江南好 博弈

    [Heoi2014]人人尽说江南好 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 581  Solved: 420[Submit][Status][D ...

  9. Nova 组件详解

    本节开始,我们将详细讲解 Nova 的各个子服务. 前面架构概览一节知道 Nova 有若干 nova-* 的子服务,下面我们将依次学习最重要的几个.今天先讨论 nova-api 和 nova-cond ...

  10. K大数查询 BZOJ 3110

    K大数查询 [问题描述] 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位 ...