2

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

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

当我浏览我发现的 StringUtils 的文档时,

空处理的副作用是 NullPointerException 应被视为 StringUtils 中的错误(不推荐使用的方法除外)。

剂量是什么意思?跟我的剧情有关系吗?

4

5 回答 5

4

阅读您引用的上面的句子:

StringUtils 安静地处理空输入字符串。也就是说,一个空输入将返回空。返回 boolean 或 int 的详细信息因方法而异。

空处理的副作用是 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。

于 2013-01-29T09:42:57.983 回答
2

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

您的验证逻辑中存在错误,或者您的数据来自未经过验证的源。

如果您发布了实际代码和 NPE 堆栈跟踪,我们可以帮助您找到它。


这是什么意思?

这意味着如果StringUtils.isNotBlank()抛出 NPE,则该方法中存在错误。(javadoc 所说的“副作用”是一种逻辑副作用;即 API 定义方式的次要逻辑结果。)

跟我的剧情有关系吗?

它与它无关......除非调用 toStringUtils.isNotBlank()抛出 NPE。


更新

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

if (StringUtils.isNotEmpty(obj.getvalue())){
    String s = obj.getvalue();
    if (s == null) {
        System.err.println("Ooops!!");
    }
}

我可以想到许多场景,在这些场景中,这段代码要么给出 NPE,要么导致“糟糕!” 要打印。例如:

  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.
    }
}
于 2013-01-29T09:45:36.147 回答
0

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

StringUtils 行为

  • StringUtils.isNotBlank(null) 返回 false
  • StringUtils.isNotBlank("") 返回 false
  • StringUtils.isNotBlank(" ") 返回 false
  • StringUtils.isNotBlank("testvalue") 返回真

如果行为是别的,这是库中的错误

于 2013-01-29T09:44:32.727 回答
0

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

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

于 2013-01-29T10:02:11.427 回答
0

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

这是使用 Guave 的一个很好的替代品:http://www.javaworld.com/article/2074361/core-java/checking-for-null-or-empty-or-white-space-only-string-in-java。 html

于 2014-05-21T11:39:27.893 回答