字符串utils中可能的空指针异常

时间:2013-01-29 09:39:36

标签: java apache-stringutils

我使用commons StringUtils.isNotBlank()来检查字符串是否为空且空白。在某些情况下,空白字符串或null作为输入验证未按预期发生。空白或空白正在通过。

   if( StringUtils.isNotEmpty(obj.getvalue()) ){
        .............
    }

当我查看documentation of StringUtils时,我找到了

  

null处理的副作用是NullPointerException   应被视为StringUtils中的错误(已弃用除外)   方法)。

它的意义是什么?它与我的场景有什么关系?

5 个答案:

答案 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!”的一些场景。打印。例如:

  1. 如果objnull,则肯定会抛出NPE。这可能发生在您调用isNotEmpty之前,或者(如果可以更改obj变量的值可以更改)在“then”块中。

  2. getValue方法可能会抛出NPE。

  3. 有可能(但不太可能)调用getValue会产生副作用,导致它改变obj的状态并返回不同的值(例如null )在第二个电话。哎呀!

  4. 当前线程正在执行上述代码时,某些其他线程可能正在更改obj对象的状态。哎呀!

  5. 这些问题中的大部分都可以“修复”如下:

    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行为

  • StringUtils.isNotBlank(null)返回false
  • StringUtils.isNotBlank(“”)返回false
  • StringUtils.isNotBlank(“”)返回false
  • StringUtils.isNotBlank(“testvalue”)返回true

如果行为是其他原因,这是libary中的一个错误

答案 3 :(得分:0)

NPE是否可能从obj.getvalue()抛出,因为StringUtils.isNotBlank()永远不会抛出NPE。 如果您在多线程环境中运行代码,则可以使方法同步,从而阻止从多个源同时访问您的方法。

如需更多帮助,您可以发送stack tracecode block吗?

答案 4 :(得分:0)

StringUtils.isNotBlank()方法或文档中实际上存在错误。如果您将null传递给isNotBlank(),则会丢弃NullPointerException,这与文档相反。因此,一个或另一个(代码或文档)是不正确的。

使用来自http://www.javaworld.com/article/2074361/core-java/checking-for-null-or-empty-or-white-space-only-string-in-java.html

的Guave,这是一个很好的替代品