我正在使用commons StringUtils.isNotBlank()来检查字符串是否不为空和空白。在某些情况下,空白字符串或 null 作为输入验证未按预期进行。空或空白正在通过。
if( StringUtils.isNotEmpty(obj.getvalue()) ){
.............
}
当我浏览StringUtils的文档时,我发现,
空处理的副作用是 NullPointerException 应该被视为 StringUtils 中的错误(已弃用的除外 方法)。
剂量是什么意思?它与我的场景有关吗?
阅读你引用的句子上面的句子:
StringUtils 安静地处理空输入字符串。也就是说,一个 空输入将返回空值。返回布尔值或整数的位置 详细信息因方法而异。
空处理的副作用是 NullPointerException 应该被视为 StringUtils 中的错误(已弃用的除外 方法)。
因此,由于它处理空值,因此不应抛出 NullPointerExceptions。
如果您查看方法,isNotBlank
,您会发现下表:
StringUtils.isNotBlank(null) = false
StringUtils.isNotBlank("") = false
StringUtils.isNotBlank(" ") = false
StringUtils.isNotBlank("bob") = true
StringUtils.isNotBlank(" bob ") = true
如果您收到其他值,则确实遇到了错误,您应该报告该错误。但NPE更有可能是由其他原因引起的。例如,也许其他一些 StringUtils 方法返回 null。
在某些情况下,空白字符串或 null 作为输入验证未按预期进行。空或空白正在通过。
验证逻辑中存在错误,或者数据来自未经验证的源。
如果您发布了实际代码和 NPE 堆栈跟踪,我们可以帮助您找到它。
什么意思?
这意味着如果StringUtils.isNotBlank()
抛出 NPE,则该方法中存在错误。 (javadoc 所说的"副作用"是一种逻辑副作用;即 API 定义方式的次要逻辑后果。
它与我的场景有关吗?
这与它无关...除非对StringUtils.isNotBlank()
的调用是抛出 NPE。
更新
考虑您的示例代码(为说明目的进行了调整):
if (StringUtils.isNotEmpty(obj.getvalue())){
String s = obj.getvalue();
if (s == null) {
System.err.println("Ooops!!");
}
}
我可以想到许多场景,其中此代码可以提供 NPE 或导致打印"Ooops! 例如:
如果
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.
}
}
为了详细检查您的问题,您可以发布一个您认为代码出错的具体示例。
StringUtils Behavior
- StringUtils.isNotBlank(null) 返回 false
- StringUtils.isNotBlank(") 返回 false
- StringUtils.isNotBlank(" ") 返回 false
- StringUtils.isNotBlank(" testvalue") 返回 true
如果行为是其他任何东西,这是库中的错误
NPE是否有可能从obj.getvalue()
抛出,因为StringUtils.isNotBlank()永远不会抛出NPE。如果在多线程环境中运行代码,则可以使方法同步,以防止从多个源同时访问方法。
如需更多帮助,您可以发送stack trace
或code block
吗?
StringUtils.isNotBlank()
方法或文档中都存在错误。如果您将null
传递给isNotBlank()
它将抛出与文档相反的NullPointerException
。因此,一个或另一个(代码或文档)是不正确的。
这是使用Guave的一个很好的替代品:http://www.javaworld.com/article/2074361/core-java/checking-for-null-or-empty-or-white-space-only-string-in-java.html