Java 字符串utils中可能存在空指针异常

Java 字符串utils中可能存在空指针异常,java,apache-stringutils,Java,Apache Stringutils,我正在使用commons StringUtils.isNotBlank()检查字符串是否为空。在某些情况下,作为输入的空白字符串或null验证没有按预期进行。Null或blank正在通过 if( StringUtils.isNotEmpty(obj.getvalue()) ){ ............. } 当我通过我发现的 null处理的一个副作用是NullPointerException 应将其视为StringUtils中的bug(不推荐使用的除外 方法)

我正在使用commons StringUtils.isNotBlank()检查字符串是否为空。在某些情况下,作为输入的空白字符串或null验证没有按预期进行。Null或blank正在通过

   if( StringUtils.isNotEmpty(obj.getvalue()) ){
        .............
    }
当我通过我发现的

null处理的一个副作用是NullPointerException 应将其视为StringUtils中的bug(不推荐使用的除外 方法)


这是什么意思?这与我的情景有关吗?

请阅读你引用的句子上方的句子:

StringUtils安静地处理空输入字符串。也就是说 null输入将返回null。返回布尔值或整数的位置 细节因方法而异

null处理的一个副作用是NullPointerException 应将其视为StringUtils中的bug(不推荐使用的除外 方法)

因此,因为它处理空值,所以不应该抛出NullPointerException

如果您检查该方法,
不为空
,您将发现以下表格:

 StringUtils.isNotBlank(null)      = false
 StringUtils.isNotBlank("")        = false
 StringUtils.isNotBlank(" ")       = false
 StringUtils.isNotBlank("bob")     = true
 StringUtils.isNotBlank("  bob  ") = true

如果您正在接收其他值,那么您确实遇到了一个bug,您应该报告它。但NPE更有可能是由其他原因引起的。例如,可能其他一些StringUtils方法返回null。

要详细检查您的问题,您可以发布一个您认为代码出错的特定示例

StringUtils行为

  • isNotBlank(null)返回false
  • StringUtils.isNotBlank(“”)返回false
  • StringUtils.isNotBlank(“”)返回false
  • isNotBlank(“testvalue”)返回true
如果行为是其他的,这就是图书馆里的一个bug

在某些情况下,作为输入的空白字符串或null验证没有按预期进行。Null或blank正在通过

   if( StringUtils.isNotEmpty(obj.getvalue()) ){
        .............
    }
要么验证逻辑中存在缺陷,要么数据来自未经验证的源

如果您发布了实际代码和NPE stacktrace,我们可以帮助您找到它


这是什么意思

这意味着如果
StringUtils.isNotBlank()
抛出一个NPE,那么该方法中就有一个bug。(javadoc所说的“副作用”是一种逻辑副作用;即API定义方式的次要逻辑后果。)

这跟我的剧本有什么关系

这与它无关。。。除非对
StringUtils.isNotBlank()
的调用正在抛出NPE


更新

考虑您的示例代码(出于说明目的进行了调整):

我可以想到一些场景,在这些场景中,这些代码要么给出一个NPE,要么导致打印“oops!”。例如:

  • 如果
    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.
        }
    }
    

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


    有关更多帮助,您可以发送
    堆栈跟踪
    代码块

    实际上,
    StringUtils.isNotBlank()
    方法或文档中存在一个bug。如果将
    null
    传递给
    isNotBlank()
    它将抛出一个
    NullPointerException
    ,这与文档相反。因此,其中一个(代码或文档)是不正确的


    这里有一个很好的替代方法,使用Guave from:

    你能更具体一点吗?你有任何代码示例吗?我正在多线程环境中运行。我的情况偶尔会发生一次。我对StringUtils文档中出现的副作用感兴趣……从这个意义上讲,它不是副作用。这是合乎逻辑的副作用;i、 e.API设计方式的逻辑结果。