字符串实用程序中可能存在空指针异常



我正在使用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! 例如:

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

  2. getValue方法可能会引发 NPE。

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

  4. 当当前线程执行上述代码时,可能还有其他线程正在更改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 tracecode 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

最新更新