在某些情况下,将空白字符串或 null 作为输入验证未按预期进行。空或空白正在通过。
您的验证逻辑中存在错误,或者您的数据来自未经过验证的源。
如果您发布了实际代码和 NPE 堆栈跟踪,我们可以帮助您找到它。
这是什么意思?
这意味着如果StringUtils.isNotBlank()
抛出 NPE,则该方法中存在错误。(javadoc 所说的“副作用”是一种逻辑副作用;即 API 定义方式的次要逻辑结果。)
跟我的剧情有关系吗?
它与它无关......除非调用 toStringUtils.isNotBlank()
是抛出 NPE。
更新
考虑您的示例代码(出于说明目的进行了调整):
if (StringUtils.isNotEmpty(obj.getvalue())){
String s = obj.getvalue();
if (s == null) {
System.err.println("Ooops!!");
}
}
我可以想到许多场景,在这些场景中,这段代码要么给出 NPE,要么导致“糟糕!” 要打印。例如:
如果obj
是,null
那么肯定会抛出 NPE。这可能发生在您调用 之前isNotEmpty
,或者(如果obj
可以更改变量的值可以更改)在“then”块中。
该getValue
方法可能会抛出 NPE。
调用getValue
有可能(但不太可能)有副作用,导致它在第二次调用时改变状态obj
并返回不同的值(例如null
)。哎呀!
obj
当当前线程正在执行上述代码时,可能有其他线程正在更改对象的状态。哎呀!
这些问题中的大多数可以按如下方式“修复”:
String s = obj.getvalue();
if (StringUtils.isNotEmpty(s)){ // No NPE possible here now
if (s == null) {
System.err.println("Ooops!!"); // Cannot happen now.
}
}