更好的比较可能为空的字符串的方法
链接
我有一个if条件,看起来像这样:
if( !str1.equals(str2) )
{
---
---
---
}
“str1和str2是两个字符串对象。”
“有可能str1为空,所以下面的代码是否等同于上述代码,并处理了空值检查?”
if( !(str1==null ? str2==null : str1.equals(str2)) )
{
---
---
---
}
谢谢!
假设你希望两个null值相等,那当然可以。根据你的方法,NullPointerException可能是正确的响应。通过了解它,您可以节省大量的打字时间。
org.apache.commons.lang.StringUtils
!StringUtils.equals(str1, str2);
会以相同的方式处理空值。
如果您正在使用Java 7:
java.util.Objects.equals(str1, str2);
是的,这将导致相同的结果。
更具体地说:
str1
不是 null,则与之前完全相同,因为它只是通过三元检查传递到与之前相同的表达式str1
是 null,则变成检查 str2
是否也为 null。由于整个三元表达式都被 !
包裹,所以其行为与之前相同。
如果您想要更清晰一些,可以将 str2==null
改为实际比较 str1
和 str2
: str1==str2
。由于其中一个值已经是 null
,所以它不需要进行引用检查而不是正确的字符串相等性检查,并且在代码中更加清晰(对我来说是这样)
正如其他人提到的那样,Apache Commons 库已经包括了这种空安全的相等性功能,但它确实需要相当大的库包含。另一方面,许多人认为 Apache Commons 功能应该被有效地视为 Java 本身的一部分,因此您可以自行决定是否需要额外的依赖项。
最后,这个功能在技术上并不等同,因为默认的 .equals()
方法会抛出一个 NullPointerException
,而您的相等性检查代码则不会。如果这是您要寻找的行为(我想是的),那么您就没问题了,但需要注意这一点。
如果您认为null
相等,并允许str2
为null
,那么它看起来是正确的。但最好不要相信任何人,而是为所有可能的情况编写测试。
使用三元运算符来进行那个检查是一种非常愚蠢的方式,它会让你的代码难以阅读。只需使用“与”操作符即可。
if(str1 != null && !str1.equals(str2))
{
---
---
---
}
你不需要导入整个新库来进行空值检查。
str2
是否等于(即null == null)str1
。相反,这段代码表示如果str1 == null
,那么它就不可能等于str2
。此答案还未回答这两个选项是否相等的问题。 - cdeszaqstr2 == null
和str1 == null
,即使str2 == str1
,您也不会进入该代码块。因此,您的代码未能通过两个输入都为null的测试,因为您的代码没有将它们视为相等,尽管它们实际上是相等的。 - cdeszaqstr1
和str2
是否不相等。他们只提到了str1
,因为如果str1
是null
,str1.equals(str2)
会导致NPE。正如在问题的第二段代码中所看到的那样,他们显然也关心str2
。当两者都为null
时,您的答案会失败。 - NullUserException是的,只有在字符串不相等时(其中一个为空或两个都不为空但不同)您的代码才会进入if
块。
另一种方法是
if( (str1 == null && str2 != null) || !str1.equals(str2) ){
// Only executes when strings are unequal
}
这是一个品味问题,有些人对三元运算符过敏。(我喜欢它们)。
str1
是null
,那么如果你执行str1.equals();
,你将会得到NullPointerException
。更多细节请查看此链接:https://dev59.com/WXE85IYBdhLWcg3wzm5p - Vyomaif( str1==null ? str2!=null : !str1.equals(str2) )
,这样可能更容易阅读。 - NullUserException