atitit.避免NullPointerException 总结and 最佳实践 o99
atitit.避免NullPointerException
对于返回集合的方法很简单,只需要返回空的集合就可以了,而不是null。 1
一种可选办法就是不使用空返回值,而是空对象模式: 1
直接抛出ex,,还是尽量的不去使用null返回值。 1
1) 从已知的String对象中调用equals()和equalsIgnoreCase()方法,而非未知对象。 2
当valueOf()和toString()返回相同的结果时,宁愿使用前者。 3
使用null安全的方法和库Apache commons 中的StringUtils 3
返回空collection或者空数组。 3
使用warp类not raw type...避免你的代码中不必要的自动包装和自动解包。 4
默认值 4
参考 4
对于返回集合的方法很简单,只需要返回空的集合就可以了,而不是null。
一种可选办法就是不使用空返回值,而是空对象模式:
直接抛出ex,,还是尽量的不去使用null返回值。
对于findAction()方法来说抛出一个带有说明的异常要比光秃秃的抛出一个NullPointerException要好的多。
1 2 3 4 5 |
try{ ParserFactory.getParser().findAction(someInput).doSomething(); } catch(ActionNotFoundException anfe) { userConsole.err(anfe.getMessage()); } |
要是你觉得使用try/catch机制比较丑的话,那就给用户比较有意义的反馈。
1 2 3 4 5 6 7 8 |
public Action findAction(final String userInput){ /* Code to return requested Action if found */ return new Action(){ public void doSomething(){ userConsole.err("Action not found: "+userInput); } } } |
。
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
1) 从已知的String对象中调用equals()和equalsIgnoreCase()方法,而非未知对象。
总是从已知的非空String对象中调用equals()方法。因为equals()方法是对称的,调用a.equals(b)和调用b.equals(a)是完全相同的,这也是为什么程序员对于对象a和b这么不上心。如果调用者是空指针,这种调用可能导致一个空指针异常
1 2 3 4 5 6 7 8 9 10 11 |
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" |
当valueOf()和toString()返回相同的结果时,宁愿使用前者。
因为调用null对象的toString()会抛出空指针异常,如果我们能够使用valueOf()获得相同的值,那宁愿使用valueOf(),传递一个null给valueOf()将会返回“null”,尤其是在那些包装类,像Integer、Float、Double和BigDecimal。
使用null安全的方法和库Apache commons 中的StringUtils
有很多开源库已经为您做了繁重的空指针检查工作。其中最常用的一个的是Apache commons 中的StringUtils。你可以使用StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其他的 工具方法而不用担心空指针异常。
1 2 3 4 5 6 7 8 9 10 11 |
//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)); |
返回空collection或者空数组。
这个Java最佳实践或技巧由Joshua Bloch在他的书Effective Java中 提到。这是另外一个可以更好的使用Java编程的技巧。通过返回一个空collection或者空数组,你可以确保在调用如 size(),length()的时候不会因为空指针异常崩溃。Collections类提供了方便的空List,Set和Map: Collections.EMPTY_LIST,Collections.EMPTY_SET,Collections.EMPTY_MAP。这里是实 例。
1 2 3 4 |
public List getOrders(Customer customer){ List result = Collections.EMPTY_LIST; return result; } |
你同样可以使用Collections.EMPTY_SET和Collections.EMPTY_MAP来代替空指针。
使用warp类not raw type...避免你的代码中不必要的自动包装和自动解包。
且不管其他如创建临时对象的缺点,如果wrapper类对象是null,自动包装同样容易导致空指针异常。例如如果person对象没有电话号码的话会返回null,如下代码会因为空指针异常崩溃。
1 2 |
Person ram = new Person("ram"); int phone = ram.getPhone(); |
默认值
参考
在Java中如何避免“!=null”式的判空语句? - ImportNew.htm
避免Java应用中NullPointerException的技巧和最佳实践 - ImportNew.htm
atitit.避免NullPointerException 总结and 最佳实践 o99相关推荐
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 《转载》Java异常处理的10个最佳实践
本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...
- 【转】Java中关于异常处理的十个最佳实践
原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...
- java微妙_10个微妙的Java编码最佳实践
编写和维护jOOQ(Java中内部DSL建模的SQL)时遇到过这些.作为一个内部DSL,jOOQ最大限度的挑战了Java的编译器和泛型,把泛型,可变参数和重载结合在一起,Josh Bloch可能不会推 ...
- java 异常 最佳实践_关于JAVA异常处理的20个最佳实践
在我们深入了解异常处理最佳实践的深层概念之前,让我们从一个最重要的概念开始,那就是理解在JAVA中有三种一般类型的可抛类: 检查性异常(checked exceptions).非检查性异常(unche ...
- 关于JAVA异常处理的20个最佳实践
关于JAVA异常处理的20个最佳实践 在我们深入了解异常处理最佳实践的深层概念之前,让我们从一个最重要的概念开始,那就是理解在JAVA中有三种一般类型的可抛类: 检查性异常(checked excep ...
- 小菜:Java异常处理的10个最佳实践
转载自 小菜:Java异常处理的10个最佳实践 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nu ...
- java 8入门与实践_30个Java入门技巧和最佳实践
java 8入门与实践 Java是最流行的编程语言之一-无论是Win应用程序,Web应用程序,移动,网络,消费电子产品,机顶盒设备,Java随处可见. 在Java上运行的设备超过30亿. 据Oracl ...
- 10个精妙的Java编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...
最新文章
- 无限极分类原理与实现
- Lotus Sametime 服务器的安装和配置
- python 共现矩阵_Python词组共现矩阵
- php 多表查询输出,ThinkPHP多表查询
- table T371A field IBTYP的search help
- DIY人脸跟踪电风扇送女朋友(1)
- 社区团购如今进行得如火如荼
- 【Qt教程】3.4 - Qt5 QPainter绘图事件、绘图功能
- com.mysql.jdbc.connection和java.sql.connection的区别
- python可以连接sql server_python连接sqlserver数据库之一
- android textview 字体边框,为TextView添加一个边框的几种办法
- CentOS8桌面图标不显示
- 逻辑上的“谬误”真的是我们应该所认为的错误吗?
- 开源并“免费”的Linux平台DAW——Ardour 4.0发布
- Java面试汇总+答案
- Smartbi手把手教你如何搭建企业大数据BI平台系统
- 软件设计领域没有银弹,但代码大师MaxKanat-Alexander的建议绝对能给你带来启发...
- Linux Centos7 配置两个(多个)JDK 用户级别JDK
- 我所理解的技术领导力
- windows8计算机在哪,win8怎么投屏,win8系统投屏在哪