繁体   English   中英

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

[英]Possible null pointer exception in string utils

我正在使用Commons StringUtils.isNotBlank()检查字符串是否不为空和空白。 在某些情况下,如果输入验证没有按预期进行,则为空字符串或null。 空或空白正在通过。

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

当我浏览StringUtils文档时,发现

空处理的副作用是,应将NullPointerException视为StringUtils中的错误(不赞成使用的方法除外)。

什么剂量 这和我的情况有关系吗?

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

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

空处理的副作用是,应将NullPointerException视为StringUtils中的错误(不赞成使用的方法除外)。

因此,由于它处理null值,因此不应引发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 stacktrace,我们可以帮助您找到它。


这是什么意思?

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

这和我的情况有关系吗?

它有什么关系呢?除非给呼叫StringUtils.isNotBlank() 抛出NPE。


UPDATE

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

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

我可以想到许多情况,这些代码可能会导致NPE或导致“糟糕!”。 待打印。 例如:

  1. 如果objnull则肯定会引发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行为

  • 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 isNotBlank() ,与文档相反。 因此,一个或另一个(代码或文档)不正确。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM