如何避免空指针异常

1、String 变量与文本值比较

在编码过程中,String 变量与文本值之间的比较是特别常见的。一般被比较的值可以是一个字符串或枚举值。因此,我们不要从空对象调用方法进行比较,而应考虑从文字值中调用方法。如下:

null

上面的代码片段则会抛出一个 NullPointerException。但是,如果我们从文字中调用方法,那么执行流程通常会继续:

null

2、检查方法的参数

在执行你自己的方法的主体之前,一定要检查方法传入的参数是否为空。只有在正确检查了参数后,才能继续执行该方法的相应逻辑。否则,您可以抛出一个 IllegalArgumentException 来通知调用方法所传递的参数有问题。

例如:

null

3、优先使用 String.valueOf()代替 toString()

当您代码中的某个对象需要用字符串的方式来表示时,请避免使用该对象的 toString 方法;因为若你的对象引用为 null,则会抛出 NullPointerException。

相反,考虑使用静态 String.valueOf 方法,该方法不会抛出任何异常,若对象引用为空,则打印「null」字符串。

4、使用三元运算符

该操作是非常有用的,可以帮助我们避免了 NullPointerException。格式如下:

null

上面通过布尔表达式来判断。如果表达式结果为 true,则返回 value1,否则返回 value2。我们可以使用三元运算符来处理空指针,如下所示:

null

如果 str 的引用为空,则消息变量将为空。否则,如果 str 指向实际数据,则该消息将保留它的前 10 个字符。

5、创建返回空集合而不是 null 值的方法

一个非常好的操作是创建返回一个空集合的方法,而不是一个 null 值。因为你的代码可以遍历空集合并使用它的方法和字段,而不会抛出一个 NullPointerException 。例如:

null

注意:要熟悉 Collections 这个集合工具类,里面有太多好用的方法了。

6、使用 Apache 的 StringUtils 类

Apache 的 Commons Lang 是一个为 java.lang API 提供帮助工具的库,比如字符串操作方法。提供字符串操作的示例类是 StringUtils.java,它对输入的字符串进行了 null 判断。

你可以使用 StringUtils.isNotEmpty,  StringUtils.IsEmpty 和 StringUtils.equals 等方法,来避免 NullPointerException。例如:

null

7、习惯用 contains(), containsKey(), containsValue() 方法

如果您的程序在使用集合,请考虑使用 contains,containsKey 和 containsValue 方法。例如,从集合中找一个特定键的值:

null

在上面的代码片段中,我们未检查 key 是否真的存在于内部 Map,因此返回的值可以是 null 。最安全的方法如下:

null

8、请检查使用的外部方法的返回值是否为 null

在编码中使用外部库是很常见的,这些库可能包含返回引用的方法,需确保返回的值不为 null 。

9、使用断言

断言在测试代码时非常有用,并且可以被使用,以避免 NullPointerException 。Java 断言是用 assert 关键字实现的,并抛出一个 AssertionError 。

使用 Java 断言的示例如下:

null

如果您执行上面的代码段并传递一个空参数 getLength,则会出现以下错误消息:

null

10、单元测试

在测试代码的功能和正确性时,单元测试一般非常有用。因此,建议多花一些时间编写一些测试用例,来避免程序出现 NullPointerException。