如何避免空指针异常
1、String 变量与文本值比较
在编码过程中,String 变量与文本值之间的比较是特别常见的。一般被比较的值可以是一个字符串或枚举值。因此,我们不要从空对象调用方法进行比较,而应考虑从文字值中调用方法。如下:
上面的代码片段则会抛出一个 NullPointerException。但是,如果我们从文字中调用方法,那么执行流程通常会继续:
2、检查方法的参数
在执行你自己的方法的主体之前,一定要检查方法传入的参数是否为空。只有在正确检查了参数后,才能继续执行该方法的相应逻辑。否则,您可以抛出一个 IllegalArgumentException 来通知调用方法所传递的参数有问题。
例如:
3、优先使用 String.valueOf()代替 toString()
当您代码中的某个对象需要用字符串的方式来表示时,请避免使用该对象的 toString 方法;因为若你的对象引用为 null,则会抛出 NullPointerException。
相反,考虑使用静态 String.valueOf 方法,该方法不会抛出任何异常,若对象引用为空,则打印「null」字符串。
4、使用三元运算符
该操作是非常有用的,可以帮助我们避免了 NullPointerException。格式如下:
上面通过布尔表达式来判断。如果表达式结果为 true,则返回 value1,否则返回 value2。我们可以使用三元运算符来处理空指针,如下所示:
如果 str 的引用为空,则消息变量将为空。否则,如果 str 指向实际数据,则该消息将保留它的前 10 个字符。
5、创建返回空集合而不是 null 值的方法
一个非常好的操作是创建返回一个空集合的方法,而不是一个 null 值。因为你的代码可以遍历空集合并使用它的方法和字段,而不会抛出一个 NullPointerException 。例如:
注意:要熟悉 Collections 这个集合工具类,里面有太多好用的方法了。
6、使用 Apache 的 StringUtils 类
Apache 的 Commons Lang 是一个为 java.lang API 提供帮助工具的库,比如字符串操作方法。提供字符串操作的示例类是 StringUtils.java,它对输入的字符串进行了 null 判断。
你可以使用 StringUtils.isNotEmpty, StringUtils.IsEmpty 和 StringUtils.equals 等方法,来避免 NullPointerException。例如:
7、习惯用 contains(), containsKey(), containsValue() 方法
如果您的程序在使用集合,请考虑使用 contains,containsKey 和 containsValue 方法。例如,从集合中找一个特定键的值:
在上面的代码片段中,我们未检查 key 是否真的存在于内部 Map,因此返回的值可以是 null 。最安全的方法如下:
8、请检查使用的外部方法的返回值是否为 null
在编码中使用外部库是很常见的,这些库可能包含返回引用的方法,需确保返回的值不为 null 。
9、使用断言
断言在测试代码时非常有用,并且可以被使用,以避免 NullPointerException 。Java 断言是用 assert 关键字实现的,并抛出一个 AssertionError 。
使用 Java 断言的示例如下:
如果您执行上面的代码段并传递一个空参数 getLength,则会出现以下错误消息:
10、单元测试
在测试代码的功能和正确性时,单元测试一般非常有用。因此,建议多花一些时间编写一些测试用例,来避免程序出现 NullPointerException。