避免Java中NullPointerException的Java技巧和最佳实践
Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢。下面我们就从几个方面来入手,解决这个棘手的问题吧。
值得庆幸的是,通过应用一些防御性编码技术并遵循应用程序多个部分之间的约定,您可以在一定程度上避免Java中的NullPointerException。
顺便说一下,在本文中,我们将学习一些Java的编码技术和最佳实践,这些技巧和最佳实践可用于避免的Java中的空指针异常。遵循这些Java的技巧还可以最大程度地减少很多Java代码中的 x !=NULL 检查。
作为经验丰富的Java的程序员,您可能已经知道其中一些技巧,并且已经在项目中遵循了这些技巧,但是对于新手和中级 发人员来说,这可能是个不错的学习机会。顺便说一句,如果您知道其他避免Java中的NullPointerException并减少的Java中的空检查的Java的技巧,请与我们分享。
Java技巧和最佳实践
这些都是简单的技术,很容易遵循,但是对代码质量和健壮性有重大影响。以我的经验,仅第一个技巧就可以显着提高代码质量。如前所述,如果您知道任何其他Java技巧或最佳实践,可以帮助减少空检查,那么可以通过评论本文与我们分享。
1)在已知的字符串而不是未知的对象上调用equals()和equalsIgnoreCase()方法
始终在不为null的已知字符串上调用equals()方法。由于equals()方法的方法是对称的,调用a.equals(b)与调用b.equals(a)是一样的,这就是为什么很多程序员不注意对象a和b。如果调用者为空,则此调用的一个副作用就是可能导致NullPointerException。
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");
}
这是避免NullPointerException的最简单的Java技巧或最佳实践,但是由于equals()是一种常见方法,因此带来了极大的改进 。
2)优先使用valueOf()而不是toString(),两个都返回相同的结果
由于在 null对象上调用toString()会引发NullPointerException ,因此,如果我们可以通过调用valueOf()获得相同的值, 则最好这样做,因为将null传递给valueOf()会返回“ null ”,特别是在诸如Integer ,Float ,Double 这样的包装类的情况下或BigDecimal 。
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); /不会抛出NPE
System.out.println(bd.toString()); //在main线程抛出java.lang.NullPointerException"异常
如果不确定对象是否为null,请遵循此Java技巧。
3、使用null安全的方法和库
有很多这样开源库,这些库为您检查空做了大量工作。最常见的一种来自Apache Common 的StringUtils。您可以使用StringUtils.isBlank() ,ISNUMERIC() ,isWhiteSpace()和其他实用程序方法,而不必担心NullPointerException 。
//StringUtils中的方法是空指针安全的, 它不会出现NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
输出结果:
true
true
false
false
但是,在使用库方法之前,请不要忘记阅读Null安全方法和类的文档。这是另一种Java最佳实践,不需要太多的时间,但可以带来很大的改进。
4、避免从方法中返回null,而应返回空集合或空数组
Joshua Bloch在他的书《Effective Java》中也提到了Java最佳实践或技巧,从这本书中你将获得更多的Java编程技巧。在公众号【Java知己】,后台回复:Effective Java,可以获得该书籍的链接。
通过返回空集合或空数组,您可以确保基本调用(如size(),length())不会因NullPointerException异常而失败。集合类提供方便的空的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 而不是返回null。
5、使用注释@NotNull和@Nullable
在编写方法时,可以通过使用@NotNull 和@Nullable 这样的注释来声明方法是否为null安全,从而定义有关可空性的契约。 现代的编译器,IDE或工具可以读取此批注并帮助您进行缺失的空检查,或者可以通知您不必要的空检查,这会使您的代码混乱。
IntelliJ IDE 和FindBugs的已经支持这种注释。这些注释也是JSR 305的一部分,但是即使在没有任何工具或IDE支持的情况下,此注释本身也可以作为文档使用。通过查看 @NotNull 和@Nullable ,程序员自己可以决定是否检查null。顺便说一句,对于Java程序员来说,这是相对较新的最佳实践,要花些时间才能被利用起来。
6、避免在代码中预先的自动装箱和拆箱
尽管存在其他缺点,例如创建临时对象,但如果包装类对象为null,则自动装箱也容易发生NullPointerException 。例如, 如果人员没有电话号码,则以下代码将失败,会NullPointerException ,而不是返回null 。
Person ram = new Person("ram");
int phone = ram.getPhone();
如果与自动装箱和拆箱一起使用,既也会引发NullPointerException 。
7、遵守约定并定义合理的预设值
在Java的中避免NullPointerException异常的最佳方法之一就是定义初始值并遵循约定。大多数NullPointerException异常发生的原因是使用不完整的信息创建对象或未提供所有必需的依赖关系。如果您不允许创建不完整的对象并优雅地拒绝任何此类请求,则可以防止很多NullPointerException 的出现。同样,如果 允许创建对象,则应该使用合理的替代值。例如,如果没有id 和name ,则不能创建Employee 对象 ,但是可以具有可选的电话号码。现在,如果员工没有电话号码而不是返回零,否则返回默认值,例如零,但是必须谨慎地选择该选项,踩在某些时候检查null很容易,而不是拨打无效号码。一个相同的注释,通过定义什么可以为空和什么不能为空,调用者可以做出明智的决定。选择fast-fail还是接受null也是您需要采取并坚持一致的重要设计方法。
8、如果您使用数据库来存储
客户,订单等领域对象,则应在数据库本身上定义空值约束。由于数据库可以从多个来源获取数据,因此在DB中进行空能力检查将确保数据完整性。保持数据库的空约束也将有助于减少_Java代码中的空检查_。从数据库加载对象时,您将确定其中一部分可以为null以及其中部分不为null,这将最大程度地减少代码中的的 !=null 检查。
9、使用空对象模式
这是避免Java中的NullPointerExcpetion的另一种方法。如果某个方法返回一个对象,该对象将在调用方上执行,例如Collection.iterator()方法返回Iterator,则调用方将在该迭代器上执行遍历。假设调用者没有任何继承器,则可以返回Null对象而不是null。Null对象是一个特殊的对象,在不同的其中中具有不同的含义,例如,在此处,调用hasNext()并返回false 的空Iterator 可以是null对象。类似地,对于返回容器或集合类型的方法,应使用空对象而不是返回null。我打算写一篇关于空对象模式,在这里我将分享Java中空对象的更多示例。
伙计们,这些都是容易理解的Java技巧和最佳实践,可以避免NullPointerException。您将不费吹灰之力就可以知道这些技巧有多有用。如果您要使用其他任何技巧来避免此例外(不在此列表中) ),则请通过评论与我们分享,我将在此处后续更新。
“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!
关注公众号:「Java 知己」,每天更新Java知识哦,期待你的到来!
- 发送「Group」,与 10 万程序员一起进步。
- 发送「面试」,领取BATJ面试资料、面试视频攻略。
- 发送「玩转算法」,领取《玩转算法》系列视频教程。
- 千万不要发送「1024」...
避免Java中NullPointerException的Java技巧和最佳实践的更多相关文章
- Java中处理异常的9个最佳实践
Java中的异常处理不是一个简单的话题.初学者很难理解,甚至有经验的开发人员也会花几个小时来讨论应该如何抛出或处理这些异常. 这就是为什么大多数开发团队都有自己的异常处理的规则和方法.如果你是一个团队 ...
- 避免Java应用中NullPointerException的技巧和最佳实践
Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键.俗话说"预防胜于治疗",对于这么令人讨厌的空指针异常,这句话也是成立的.值得庆幸的是运用一 ...
- Java 编程中关于异常处理的 10 个最佳实践
异常处理是Java 开发中的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch 和 ...
- java.lang.NullPointerException at java.lang.ProcessBuilder.start(Unknown Source) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482)
1:问题出现的原因,部署好的hadoop-2.6.4进行window10操作hadoop api出现的错误,具体错误是我向hdfs上传文件,还好点,之前解决过,这里不叙述,这里说一下从hdfs下载文件 ...
- Java中数组操作 java.util.Arrays 类常用方法的使用
任何一门编程语言,数组都是最重要和常用的数据结构之一,但不同的语言对数组的构造与处理是不尽相同的. Java中提供了java.util.Arrays 类能方便地操作数组,并且它提供的所有方法都是静态的 ...
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...
- 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》
目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...
- 【转】超实用的JavaScript技巧及最佳实践
众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现 ...
- 超实用的JavaScript技巧及最佳实践
众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现 ...
随机推荐
- 算法之冒泡排序手写之js写法andjava写法
对于经典算法,你是否也遇到这样的情形:学时觉得很清楚,可过阵子就忘了? 本系列文章帮助你解决这个问题. 其实排序算法,仔细品读他的名字就见名知意了. 比如冒泡排序就很形象,遍历n次,每次循环相邻元素两 ...
- 一个diango项目的结构
一个项目的结构 day43项目 .idea 配置 pycharm自动帮配的配置,打开别人的diango项目时要先删了此项 app01 方便在一个大的Django项目中,管理实现不同的业务功能 migr ...
- Weather with you主题说明
使用前请确保拥有js权限!!! 源代码: css: /*广告去死*/ #ad_t2 { display: none !important; } #i-amphtml-fill-content { di ...
- 统计学习方法与Python实现(三)——朴素贝叶斯法
统计学习方法与Python实现(三)——朴素贝叶斯法 iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.定义 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设 ...
- [C]副作用和序列点
概述 副作用: <C语言核心技术>对副作用的描述: 表达式内包含了一串的常量.标识符.运算符(指示的运算方式).表达式的目的可以是获得结果值,或者得到运算的副作用(side effect) ...
- 淘宝爬取图片和url
刚开始爬取了 百度图片和搜狗图片 但是图片不是很多,随后继续爬取淘宝图片,但是淘宝反爬比较厉害 之前的方法不能用 记录可行的 淘宝爬取 利用selenium爬取 https://cloud.tence ...
- PHP 将内容写入word pdf 换行符不生效咋办
答:把单引号换成双引号就能解析换行符(\n)了,
- Ubuntu下预览raw格式图片
默认Ubuntu下资源管理器是不可以直接预览raw格式图片的,这就给查看图片带来很大的不便,下面我们就选择安装UFRaw来预览Raw格式图片 1. 首先在terminal安装UFRaw sudo ap ...
- redis的embstr编码
问题来了 今天在看书籍<Redis设计与实现>的时候,在8.2字符串对象里面写到 如果字符串对象保存的是一个字符串值, 并且这个字符串值的长度大于 39 字节, 那么字符串对象将使用一个简 ...
- Java方法之参数传递机制
目录 Java方法之参数传递机制 基本数据类型 引用数据类型 综合练习 总结 Java方法之参数传递机制 Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做 ...