Java 字符串utils中可能存在空指针异常
我正在使用commons StringUtils.isNotBlank()检查字符串是否为空。在某些情况下,作为输入的空白字符串或null验证没有按预期进行。Null或blank正在通过Java 字符串utils中可能存在空指针异常,java,apache-stringutils,Java,Apache Stringutils,我正在使用commons StringUtils.isNotBlank()检查字符串是否为空。在某些情况下,作为输入的空白字符串或null验证没有按预期进行。Null或blank正在通过 if( StringUtils.isNotEmpty(obj.getvalue()) ){ ............. } 当我通过我发现的 null处理的一个副作用是NullPointerException 应将其视为StringUtils中的bug(不推荐使用的除外 方法)
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
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
方法可能会抛出NPEgetValue
有可能(但不太可能)产生副作用,导致它更改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设计方式的逻辑结果。