如何检查我的字符串是否等于null?

193

我希望只在我的字符串有意义的值时执行某些操作。因此,我尝试了这个。

if (!myString.equals("")) {
doSomething
}

而且这个

if (!myString.equals(null)) {
doSomething
}

还有这个

if ( (!myString.equals("")) && (!myString.equals(null))) {
doSomething
}

并且这个

if ( (!myString.equals("")) && (myString!=null)) {
doSomething
}

并且这个

if ( myString.length()>0) {
doSomething
}

无论何种情况下,尽管我的字符串为空,但我的程序doSomething仍然执行。 它等于null。 那么,出了什么问题呢?

补充:

我找到了问题的原因。该变量被声明为字符串,因此将null分配给该变量时,它被转换为"null"! 因此,if(! myString.equals("null"))有效。


2
null 没有任何方法,因此也没有 equals()。如果 myStringnull,你怎么可能调用它的方法呢? :) - BalusC
1
我可以建议您在if块之前立即使用System.out.println(myString),以便查看其中的内容吗? - Michael Myers
1
你怎么知道“它等于null”? - Richard JP Le Guen
7
null 赋给该变量时被转换为了 "null",这是一个非常糟糕的想法。如有可能,请尝试更改此设计。 - polygenelubricants
9
呸 - 我不认为检查(!myString.equals("null"))是最好的解决方案。我怀疑大多数人会认为将字符串“null”赋值给myString的点是一个bug。 - Bert F
1
我不希望任何人像我一样感到困惑,因此澄清一下:当字符串没有被赋值时,它不会得到一个值为“null”的值,而是得到一个null的值(没有括号,基本上意味着里面什么也没有)。在“问题的附加部分”提供的解决方案非常特定于Roman的程序。 - Atlantis
28个回答

255
if (myString != null && !myString.isEmpty()) {
  // doSomething
}

作为进一步的说明,你应该了解在equals方法中这个术语:
来自Object.equals(Object)

对于任何非空引用值xx.equals(null)应该返回false.

null进行比较的方法是使用x==nullx!=null.
此外,如果x == null,那么x.fieldx.method()都会抛出NullPointerException异常。

2
出于效率考虑,您应该进行长度检查而不是等于检查。请查看此链接http://hanuska.blogspot.com/2006/08/empty-string.html。 - CoolBeans
7
为了提高可读性,我建议您使用s.isEmpty()而不是s.length() == 0。在性能方面的差异可以忽略不计。我确实同意s.equals("")很糟糕。 - polygenelubricants
6
我同意可读性的问题。这要取决于我们使用的是Java 5还是Java 6,因为isEmpty()仅在Java 6中存在。 - CoolBeans
@CoolBeans:好评论!我之前没有意识到这一点!我有点晚来参加Java派对=) - polygenelubricants

34

如果myStringnull,那么调用myString.equals(null)myString.equals("")会导致NullPointerException。在null变量上无法调用任何实例方法。

先像这样检查是否为null:

if (myString != null && !myString.equals("")) {
    //do something
}

这个方法利用了短路求值,在myString未通过空值检查时不会尝试使用.equals方法。


1
+1 是短路运算符,对于表达式的工作至关重要。然而,你真的应该使用 .isEmpty() 而不是 .equals("") - polygenelubricants
1
好的,我本来是想在这篇文章下留言的。哈哈。"出于效率考虑,你应该进行长度检查而不是等于检查。请查看此链接hanuska.blogspot.com/2006/08/empty-string.html" - CoolBeans
@CoolBeans:当然,使用Java 6,你甚至可以使用myString.isEmpty()。但在这个层面上,可读性胜过优化,人们可能更习惯于阅读myString.equals("")。(或者也可能不是这样。) - Michael Myers

27

使用Apache commons StringUtils.isNotEmpty 是最佳选择。


2
或者使用 StringUtils.isEmpty() 来检查字符串是否为 Null/Empty。 - Oozeerally

15

如果 myString 为 null,那么任何引用调用都将失败并抛出 Null Pointer Exception(NPE)异常。自 Java 6 起,应使用 #isEmpty 方法进行长度检查(无论如何,永远不要通过检查创建一个新的空字符串)。

if (myString != null &&  !myString.isEmpty()){
    doSomething();
}

顺便提一下,如果你像你所做的那样将其与字符串文字进行比较,则会反转语句,以避免进行空检查,即

if ("some string to check".equals(myString)){
  doSomething();
} 

而不是:

if (myString != null &&  myString.equals("some string to check")){
    doSomething();
}

1
不错的观点,但是最后两个if语句并不等价。当myString =“abc”时,中间的if语句不会调用doSomething函数,但第三个if语句会。 - rimsky
@rimsky 已经修复。 - pavi2410

10

工作中 !!!!

 if (myString != null && !myString.isEmpty()) {
        return true;
    }
    else {
        return false;
    }

已更新

对于Kotlin,我们通过以下方式检查字符串是否为null:

return myString.isNullOrEmpty() // Returns `true` if this nullable String is either `null` or empty, false otherwise

return myString.isEmpty() // Returns `true` if this char sequence is empty (contains no characters), false otherwise

7
您需要检查myString对象是否为null:
if (myString != null) {
    doSomething
}

6
如果您的字符串为null,类似这样的调用应该会抛出NullReferenceException异常:
myString.equals(null)
但无论如何,我认为您需要的是这样一个方法:
public static class StringUtils
{
    public static bool isNullOrEmpty(String myString)
    {
         return myString == null || "".equals(myString);
    }
}

然后在您的代码中,您可以做以下操作:

if (!StringUtils.isNullOrEmpty(myString))
{
    doSomething();
}

6

我建议使用现有的工具或创建自己的方法:

public static boolean isEmpty(String string) {
    return string == null || string.length() == 0;
}

需要时只需使用它:

if (! StringUtils.isEmpty(string)) {
  // do something
}

如上所述,|| 和 && 运算符会短路。这意味着一旦它们能够确定自己的值,它们就会停止。因此,如果 (string == null) 为 true,则不需要评估长度部分,因为表达式总是为 true。同样,对于 && 运算符,如果左侧为 false,则表达式总是为 false,无需进一步评估。
另外需要注意的是,使用 length 通常比使用 .equals 更好。性能略微更好(不多),并且不需要对象创建(虽然大多数编译器可能会将其优化)。

5

请尝试,

myString!=null && myString.length()>0

如果myString为空,则不可能实现此操作。 - hsmit
5
当myString为null时,这种情况是完全可能的。你应该知道,当&&左边部分失败时,右表达式将根本不会被评估。 - bragboy

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接