if 语句检查空值,但仍引发 NullPointerException

2022-09-01 04:13:09

在此代码中。

public class Test {
     public static void testFun(String str) {
         if (str == null | str.length() == 0) {
             System.out.println("String is empty");
         } else { 
             System.out.println("String is not empty");
         }
     }
     public static void main(String [] args) {
         testFun(null);
    }
}

我们将一个值传递给函数 。编译正常,但给出了一个在运行时,这是我没想到的。为什么它引发异常,而不是评估条件并打印“字符串为空”?nulltestFunNullPointerExceptioniftrue


假设要传递到的实际参数的值是从某个进程生成的。假设该进程错误地返回了一个值,并将其提供给 testFun。如果是这种情况,如何验证传递给函数的值是否为空?testFunnull

一种(奇怪的)解决方案可能是将形式参数分配给函数中的某个变量,然后对其进行测试。但是,如果有许多变量传递给函数,这可能会变得乏味且不可行。那么,在这种情况下如何检查空值呢?


答案 1

编辑内容准确地显示了有效的代码和不起作用的代码之间的区别。

此检查始终计算这两个条件,如果为 null,则引发异常:str

 if (str == null | str.length() == 0) {

而这(使用而不是)是短路 - 如果第一个条件的计算结果为 ,则不计算第二个条件。|||true

有关 的说明,请参阅 JLS 的第 15.24 节,有关二进制的说明,请参阅第 15.22.2 节。第15.24节的介绍是重要的一点:|||

条件或运算符||运算符类似于|(§15.22.2),但仅当其左侧操作数的值为 false 时,才计算其右侧操作数。


答案 2

您可以使用 :StringUtils

import org.apache.commons.lang3.StringUtils;

if (StringUtils.isBlank(str)) {

System.out.println("String is empty");

} else { 

System.out.println("String is not empty");

}

也看看这里:StringUtils.isBlank() vs String.isEmpty()

isBlank例子:

StringUtils.isBlank(null)      = true
StringUtils.isBlank("")        = true  
StringUtils.isBlank(" ")       = true  
StringUtils.isBlank("bob")     = false  
StringUtils.isBlank("  bob  ") = false

推荐