NullpointerException处理
毫无疑问,空指针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有自己的逻辑需要实现,既然你调用我,那么就需要满足我的要求,而不是我适应方法调用方的需求!
可能例子举的有些抽象,我整理下主要思想:
- 对于传入的参数,方法非底层方法,那么只按照自己认定的方式处理。比如我就认为这个参数不为null,并且后续的处理方式有代码必须要求该参数不可为空,如果为null就会抛出NullpointerException,然后只需要按照不为null的方式处理,不会判断是否为null;
- 同样对于传入的参数,如果方法已经是底层的方法,对该参数不会有不为null的要求,那就需要该方法进行相应空指针判断了,因为你需要抛出对应的异常信息;
- 如果是调用其他方法得到的结果,如果一定需要不为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处理的更多相关文章
- solr定时更新索引遇到的问题(SolrDataImportProperties Error loading DataImportScheduler properties java.lang.NullPointerException)
问题描述 报如下错误,很显然,问题原因:空指针异常: ERROR (localhost-startStop-1) [ ] o.a.s.h.d.s.SolrDataImportProperties ...
- GUI学习中错误Exception in thread "main" java.lang.NullPointerException
运行时出现错误:Exception in thread "main" java.lang.NullPointerException 该问题多半是由于用到的某个对象只进行了声明,而没 ...
- java.lang.NullPointerException的可能原因及处理
java.lang.NullPointerException的可能原因及处理 java.lang.NullPointerException具体意思是空指针异常,最常见的问题就是没有初始化. 字符串等数 ...
- 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 ...
- 用java下载hdfs文件报NullPointerException
用fs.copyToLocalFile( hdfsPath,localPath);下载hdfs的文件会报NullPointerException,具体报错为: java.lang.NullPointe ...
- ListView遍历每个Item出现NullPointerException的异常
在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...
- jsp发布:Could not publish server configuration: null. java.lang.NullPointerException
1.jsp发布: Could not publish server configuration: null. java.lang.NullPointerException
- java.lang.NullPointerException org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69)
采用SSH框架时出现了 java.lang.NullPointerException org.apache.struts2.impl.StrutsActionProxy.getErrorMessage ...
- 转载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 ...
- android 解决.XML提示ava.lang.NullPointerException at错误后XML没显示
提示错误: java.lang.NullPointerException Exception details are logged in Window > Show View > Erro ...
随机推荐
- 如何调节Eclipse下console输出字体的大小??
打开window - preferences-- general - appearance - colors and fonts --debug - console font 就可以调节了.
- 2017年05月10日记一次微项目投产 | 安卓版微信内置浏览器不能解析gzip压缩过的mp4视频的问题
前言 今天投产了一个小项目,一个很简单的H5,有播放视频功能,使用了videojs插件. 之前也做过数个视频播放,视频的转压都按照既定流程进行,文件放到FTP后,iphone和安卓机测试下来都没有问题 ...
- android 学习 ListView使用补充
前面两篇学习适配器的时候用的就是listview,主要是简单的添加,今晚在看了下listview滚动状态事件和动态加载数据,一个小demo. listview的滚动状态主要有三种,onScrollSt ...
- FTP服务
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为 "文传协议" 用于Internet上的控制文件的双向传输.同时,它也是一个应用程序( ...
- 程序员的Epic Fail [0]
作为程序员,我们经常会被客户问的一个问题一定是不是说很容易么,为什么花了这么长时间.不得不说,程序员可能是最糟糕的计划者,按时按点按计划完成的软件项目永远是下一个项目.一个项目的延期,有很多这样那样的 ...
- StringBulider简单用法
StringBuild的是个动态对象,可直接拼加上字符串:而string对象的步骤:先初始化对象并赋值了,而后在拼加字符串时,先要创建需要拼加的字符串,然后再拼加,所以这就是StirngBuild远比 ...
- Java获取精确到秒的时间戳(转)
1.时间戳简介: 时间戳的定义:通常是一个字符序列,唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01 ...
- python--注释
python中单行注释用#,多行注释用""",看下面的代码: #!/usr/bin/python #coding:utf-8 #编码方式 #打印一行* print &qu ...
- 在 ASP.NET Core 中执行租户服务
在 ASP.NET Core 中执行租户服务 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunna ...
- TP-Link路由器无线WIFi的设置
TP-Link路由器无线WIFi的设置.. ------------------ 确保网线接好,TP-LINK 路由器接好后,打开浏览器,在地址栏输入:192.168.1.1 输入用户名和密码(默认都 ...