java 避免出现NullPointerException(空指针)的方法总结

Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。俗话说“预防胜于治疗”,对于这么令人讨厌的空指针异常,这句话也是成立的。值得庆幸的是运用一些防御性的编码技巧,跟踪应用中多个部分之间的联系,你可以将Java中的空指针异常控制在一个很好的水平上。顺便说一句,这是Javarevisited上的第二个空指针异常的帖子。在上个帖子中我们讨论了Java中导致空指针异常的常见原因,而在本教程中我们将会学习一些Java的编程技巧和最佳实践。这些技巧可以帮助你避免Java中的空指针异常。遵从这些技巧同样可以减少Java代码中到处都有的非空检查的数量。作为一个有经验的Java程序员,你可能已经知道其中的一部分技巧并且应用在你的项目中。但对于新手和中级开发人员来说,这将是很值得学习的。顺便说一句,如果你知道其它的避免空指针异常和减少空指针检查的Java技巧,请和我们分享。
这些都是简单的技巧,很容易应用,但是对代码质量和健壮性有显著影响。根据我的经验,只有第一个技巧可以显著改善代码质量。如我之前所讲,如果你知道任何避免空指针异常和减少空指针检查的Java技巧,你可以通过评论本文来和分享。
1) 从已知的String对象中调用equals()和equalsIgnoreCase()方法,而非未知对象。
总是从已知的非空String对象中调用equals()方法。因为equals()方法是对称的,调用a.equals(b)和调用b.equals(a)是完全相同的,这也是为什么程序员对于对象a和b这么不上心。如果调用者是空指针,这种调用可能导致一个空指针异常
Object unknownObject = null;
//错误方式 – 可能导致 NullPointerException
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
//正确方式 - 即便 unknownObject是null也能避免NullPointerException
if("knownObject".equals(unknownObject)){
System.err.println("better coding avoided NullPointerException");
}
这是避免空指针异常最简单的Java技巧,但能够导致巨大的改进,因为equals()是一个常见方法。
2) 当valueOf()和toString()返回相同的结果时,宁愿使用前者。
因为调用null对象的toString()会抛出空指针异常,如果我们能够使用valueOf()获得相同的值,那宁愿使用valueOf(),传递一个null给valueOf()将会返回“null”,尤其是在那些包装类,像Integer、Float、Double和BigDecimal。
BigDecimal bd = getPrice(); System.out.println(String.valueOf(bd)); //不会抛出空指针异常 System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"
3) 使用null安全的方法和库 有很多开源库已经为您做了繁重的空指针检查工作。其中最常用的一个的是Apache commons 中的StringUtils。你可以使用StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其他的工具方法而不用担心空指针异常。
//StringUtils方法是空指针安全的,他们不会抛出空指针异常 System.out.println(StringUtils.isEmpty(null)); System.out.println(StringUtils.isBlank(null)); System.out.println(StringUtils.isNumeric(null)); System.out.println(StringUtils.isAllUpperCase(null)); Output: true true false false
但是在做出结论之前,不要忘记阅读空指针方法的类的文档。这是另一个不需要下大功夫就能得到很大改进的Java最佳实践。
4) 避免从方法中返回空指针,而是返回空collection或者空数组。
这个Java最佳实践或技巧由Joshua Bloch在他的书Effective Java中提到。这是另外一个可以更好的使用Java编程的技巧。通过返回一个空collection或者空数组,你可以确保在调用如size(),length()的时候不会因为空指针异常崩溃。Collections类提供了方便的空List,Set和Map: Collections.EMPTY_LIST,Collections.EMPTY_SET,Collections.EMPTY_MAP。这里是实例。
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
你同样可以使用Collections.EMPTY_SET和Collections.EMPTY_MAP来代替空指针。
5) 使用annotation@NotNull 和 @Nullable
在写程序的时候你可以定义是否可为空指针。通过使用像@NotNull和@Nullable之类的annotation来声明一个方法是否是空指针安全的。现代的编译器、IDE或者工具可以读此annotation并帮你添加忘记的空指针检查,或者向你提示出不必要的乱七八糟的空指针检查。IntelliJ和findbugs已经支持了这些annotation。这些annotation同样是JSR 305的一部分,但即便IDE或工具中没有,这个annotation本身可以作为文档。看到@NotNull和@Nullable,程序员自己可以决定是否做空指针检查。顺便说一句,这个技巧对Java程序员来说相对比较新,要采用需要一段时间。
6) 避免你的代码中不必要的自动包装和自动解包。
且不管其他如创建临时对象的缺点,如果wrapper类对象是null,自动包装同样容易导致空指针异常。例如如果person对象没有电话号码的话会返回null,如下代码会因为空指针异常崩溃。
Person ram = new Person("ram");
int phone = ram.getPhone();
当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。
7) 遵从Contract并定义合理的默认值。
在Java中避免空指针异常的一个最好的方法是简单的定义contract并遵从它们。大部分空指针异常的出现是因为使用不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并优雅地拒绝这些请求,你可以在接下来的工作者预防大量的空指针异常。类似的,如果对象允许创建,你需要给他们定义一个合理的默认值。例如一个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回一个默认值(例如0)来代替返回null。但是必须谨慎选择,哟有时候检查空指针比调用无效号码要方便。同样的,通过定义什么可以是null,什么不能为null,调用者可以作出明智的决定。failing fast或接受null同样是一个你需要进行选择并贯彻的,重要的设计决策
8)定义数据库中的字段是否可为空。
如果你在使用数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本身定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据空中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载一个对象是你会明确,哪些字段是可以为null的,而哪些不能,这可以使你代码中不必要的!= null检查最少化。
9) 使用空对象模式(Null Object Pattern)
还有一种方法来避免Java中的空指针异常。如果一个方法返回对象,在调用者中执行一些操作,例如Collection.iterator()方法返回迭代器,其调用者执行遍历。假设如果一个调用者并没有任何迭代器,其可以返回空对象(Null object)而非null。空对象是一个特殊的对象,其在不同的上下文中有不同的意义。例如一个空的迭代器调用hasNext()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。我打算另写一篇文章来讲空对象模式,分享几个Java空对象的例子。
这就是全部了,这是几个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# NullPointerException
# 如何避免空指针
# NullPointerException避免技巧
# Android中利用NetworkInfo判断网络状态时出现空指针(NullPointerExcep
# 解决java.lang.NullPointerException报错以及分析出现的几种原因
# java.lang.NullPointerException异常问题解决方案
# 详解Java中NullPointerException异常的原因详解以及解决方法
# 无感NullPointerException的值相等判断方法
# 你可以
# 这是
# 是一个
# 抛出
# 为空
# 一句
# 的是
# 调用者
# 几个
# 在这里
# 将会
# 默认值
# 中有
# 你知道
# 迭代
# 而非
# 数据库中
# 中不
# 不完整
# 象中
相关文章:
网站制作网站,深圳做网站哪家比较好?
如何用5美元大硬盘VPS安全高效搭建个人网站?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
如何零基础在云服务器搭建WordPress站点?
音乐网站服务器如何优化API响应速度?
如何快速搭建高效WAP手机网站吸引移动用户?
C#怎么使用委托和事件 C# delegate与event编程方法
浅析上传头像示例及其注意事项
公司门户网站制作流程,华为官网怎么做?
建站之星logo尺寸如何设置最合适?
,柠檬视频怎样兑换vip?
如何做网站制作流程,*游戏网站怎么搭建?
如何用已有域名快速搭建网站?
Python lxml的etree和ElementTree有什么区别
如何在云指建站中生成FTP站点?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
开源网站制作软件,开源网站什么意思?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
宝塔建站助手安装配置与建站模板使用全流程解析
建站主机是否属于云主机类型?
广州建站公司哪家好?十大优质服务商推荐
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
如何在企业微信快速生成手机电脑官网?
如何做静态网页,sublimetext3.0制作静态网页?
安云自助建站系统如何快速提升SEO排名?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
如何通过商城免费建站系统源码自定义网站主题?
常州自助建站工具推荐:低成本搭建与模板选择技巧
如何基于PHP生成高效IDC网络公司建站源码?
,想在网上投简历,哪几个网站比较好?
海南网站制作公司有哪些,海口网是哪家的?
建站之星如何快速生成多端适配网站?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站制作难吗安全吗,做一个网站需要多久时间?
如何获取PHP WAP自助建站系统源码?
网站微信制作软件,如何制作微信链接?
山东云建站价格为何差异显著?
如何用低价快速搭建高质量网站?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
定制建站是什么?如何实现个性化需求?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
香港服务器部署网站为何提示未备案?
建站之星如何实现五合一智能建站与营销推广?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何批量查询域名的建站时间记录?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何用AWS免费套餐快速搭建高效网站?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
*请认真填写需求信息,我们会在24小时内与您取得联系。