毫无疑问,空指针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. solr定时更新索引遇到的问题(SolrDataImportProperties Error loading DataImportScheduler properties java.lang.NullPointerException)

    问题描述 报如下错误,很显然,问题原因:空指针异常: ERROR (localhost-startStop-1) [   ] o.a.s.h.d.s.SolrDataImportProperties ...

  2. GUI学习中错误Exception in thread "main" java.lang.NullPointerException

    运行时出现错误:Exception in thread "main" java.lang.NullPointerException 该问题多半是由于用到的某个对象只进行了声明,而没 ...

  3. java.lang.NullPointerException的可能原因及处理

    java.lang.NullPointerException的可能原因及处理 java.lang.NullPointerException具体意思是空指针异常,最常见的问题就是没有初始化. 字符串等数 ...

  4. Java Web项目报错java.lang.NullPointerException at org.apache.jsp.front.index_jsp._jspInit(index_jsp.java:30)

    环境:myeclipse+tomcat6+jdk6 今天搭建了一个Java Web项目,访问index.jsp时报如下错误: 严重: Servlet.service() for servlet jsp ...

  5. 用java下载hdfs文件报NullPointerException

    用fs.copyToLocalFile( hdfsPath,localPath);下载hdfs的文件会报NullPointerException,具体报错为: java.lang.NullPointe ...

  6. ListView遍历每个Item出现NullPointerException的异常

    在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...

  7. jsp发布:Could not publish server configuration: null. java.lang.NullPointerException

    1.jsp发布: Could not publish server configuration: null. java.lang.NullPointerException

  8. java.lang.NullPointerException org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69)

    采用SSH框架时出现了 java.lang.NullPointerException org.apache.struts2.impl.StrutsActionProxy.getErrorMessage ...

  9. 转载java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.spinner/com.example.spinner.MainActivity}: java.lang.NullPointerException

    今天学习Android开发突然遇到了这个问题,查阅了很多资料,并且对集中原因进行了分析. 错误信息字符串:java.lang.RuntimeException: Unable to start act ...

  10. android 解决.XML提示ava.lang.NullPointerException at错误后XML没显示

    提示错误: java.lang.NullPointerException Exception details are logged in Window > Show View > Erro ...

随机推荐

  1. 使用 Git 同步时出现ssl错误

    错误提示 fatal: unable to access 'https://android.googlesource.com/platform/prebuilts/qemu-kernel/': gnu ...

  2. Oracle用户的初始化问题

    上一篇博文介绍了关于.bashrc和.bash_profile的相关知识,在oracle的用户设置中能发挥作用. 场景:上周准备学习一下oracle,下载了安装文件后,在linux上新建了一个用户or ...

  3. QtWebKit/QtWebEngine移植差异(网摘)

    QtWebKit/QtWebEngine移植差异 原文出处:[wiki.qt.io] This guide gives an overview of the differences between t ...

  4. javascript今生前世

    事情得从一个chrome控制台中的无意打印说起. 众所周知,js共六种数据类型,string.number.undefined.boolean.object.null.当然javascript还准备了 ...

  5. CentOS 7 服务器配置--安装nginx

    #安装pcre yum install -y pcre-devel #安装zlib-devel yum install -y zlib-devel #下载nginx wget -r -np -nd h ...

  6. python基础入门(1)

    1.python环境安装 1.1 windows安装 打开官网 https://www.python.org/downloads/windows/ 下载中心 安装过程和普通应用过程一样,如果是pyth ...

  7. IDE UltraEdit 图文激活+安装教程

    IDE UltraEdit 安装+激活图文.. ---------------- ---------------- ---------------- ---------------- -------- ...

  8. [目标检测]PVAnet原理

    创新点:基于Faster-RCNN使用更高效的基础网络 1.1 创新点 PVAnet是RCNN系列目标方向,基于Faster-RCNN进行改进,Faster-RCNN基础网络可以使用ZF.VGG.Re ...

  9. PHPcms9.6.0任意文件上传漏洞直接getshell 利用教程

    对于PHPcms9.6.0 最新版漏洞,具体利用步骤如下: 首先我们在本地搭建一个php环境,我这里是appserv或者使用phpnow (官网下载地址:http://servkit.org/) (只 ...

  10. Django项目之小博客

    学习了几天Django,学着做了一个简易的小博客,主要用来练习Django基本的操作. 主要用到的命令和Django包.模块等: django.urls.url django.urls.import ...