我使用commons StringUtils.isNotBlank()来检查字符串是否为空且空白。在某些情况下,空白字符串或null作为输入验证未按预期发生。空白或空白正在通过。
if( StringUtils.isNotEmpty(obj.getvalue()) ){
.............
}
当我查看documentation of StringUtils时,我找到了
null处理的副作用是NullPointerException 应被视为StringUtils中的错误(已弃用除外) 方法)。
它的意义是什么?它与我的场景有什么关系?
答案 0 :(得分:4)
阅读您引用的句子上方的句子:
StringUtils静静地处理空输入字符串。也就是说a null输入将返回null。返回boolean或int的位置 细节因方法而异。
null处理的副作用是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,例如。
答案 1 :(得分:2)
在某些情况下,对于空字符串或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.
}
}
答案 2 :(得分:0)
要详细检查您的问题,您可以发布一个代码出错的具体示例。
StringUtils行为
如果行为是其他原因,这是libary中的一个错误
答案 3 :(得分:0)
NPE是否可能从obj.getvalue()
抛出,因为StringUtils.isNotBlank()永远不会抛出NPE。
如果您在多线程环境中运行代码,则可以使方法同步,从而阻止从多个源同时访问您的方法。
如需更多帮助,您可以发送stack trace
或code block
吗?
答案 4 :(得分:0)
StringUtils.isNotBlank()
方法或文档中实际上存在错误。如果您将null
传递给isNotBlank()
,则会丢弃NullPointerException
,这与文档相反。因此,一个或另一个(代码或文档)是不正确的。