如何在Java中检查字符串是否为空?

103

我该如何在Java中检查字符串是否为空?

stringname.equalsignorecase(null)

但是它没有起作用。


  1. equalsignorecase - 如果传递的参数为null,则返回false。
  2. 由于stringname是一个字符串对象,您可以简单地使用stringname == null。
- Debu
19个回答

181

string == null比较的是对象是否为null。 string.equals("foo")比较的是对象内部的值。 string == "foo"并不总是起作用,因为你试图查看的是对象是否相同,而不是它们所表示的值。


更长的回答:

如果你尝试这样做,它不起作用,就像你发现的一样:

String foo = null;
if (foo.equals(null)) {
    // That fails every time. 
}

原因是foo为空,所以它不知道什么是.equals; 没有对象可以从中调用.equals。

你可能想要的是:

String foo = null;
if (foo == null) {
    // That will work.
}

处理字符串时,防止出现空指针的典型方法是:

String foo = null;
String bar = "Some string";
...
if (foo != null && foo.equals(bar)) {
    // Do something here.
}
那样,如果foo是空的,它不会评估条件语句的第二部分,一切都好。
如果您使用的是String字面值(而不是变量),那么简单的方法是:
String foo = null;
...
if ("some String".equals(foo)) {
    // Do something here.
}

如果您想避免这个问题,Apache Commons提供了一个类 - StringUtils - 它提供了对空字符串的安全操作。

if (StringUtils.equals(foo, bar)) {
    // Do something here.
}

另一个回答开玩笑地建议你这样做:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}
请不要这样做。只有在出现异常错误时才应该抛出异常;如果您预期将得到null值,则应事先检查它,而不允许它抛出异常。
在我看来,这么做有两个原因。首先,异常会减慢程序的运行速度;检查是否为null是快速的,但当JVM抛出异常时,会占用很多时间。其次,如果您仅在空指针之前进行检查,则代码更易于阅读和维护。

2
你错过了Yoda版本,这也总是起作用的: if(“foo”。equalsIgnoreCase(string)) - Omry Yadan
2
很好的有用解释。感谢你友善的态度。 - james.garriss
@aioobe 我想我们意见一致吧?如果您能更清楚地表达,我很乐意进行编辑。 - Dean J

33
s == null

不能工作?


4
如果你想比较值,你只需要使用equals()。但是,如果你想检查一个变量是否为null,你需要使用== - Felix Kling

17

当然可以工作。你错过了代码的一个关键部分。你只需要像这样做:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

;)


30
如果你一直读到了这里,请意识到@aioobe只是在开玩笑,你不应该用这种方式去做。 - Dean J

12

在 Android 开发中使用 TextUtils 方法。

TextUtils.isEmpty(str) : 如果字符串为 null 或长度为 0,则返回 true。 参数: str 要检查的字符串 返回值: 如果 str 为 null 或长度为零,则返回 true

  if(TextUtils.isEmpty(str)) {
        // str is null or lenght is 0
    }

以下是此方法的源代码。您可以直接使用。

 /**
     * Returns true if the string is null or 0-length.
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.length() == 0)
            return true;
        else
            return false;
    }

5

如果我们看一下equalsIgnoreCase方法的实现,我们会发现以下部分:

if (string == null || count != string.count) {
    return false;
}

如果参数是null,那么它将始终返回false。这显然是正确的,因为唯一应该返回true的情况是在一个null String上调用equalsIgnoreCase,但是...

String nullString = null;
nullString.equalsIgnoreCase(null);

如果对象为空,调用equals方法肯定会导致NullPointerException异常。

因此,equals方法并不是为了测试对象是否为空而设计的,只是因为你不能在null上调用它们。


4

这看起来有点奇怪,但是...


stringName == null || "".equals(stringName)

使用这种方式从未出现问题,而且这是一种安全的检查方式,避免了潜在的空指针异常。


在编程中要注意空指针异常,在这种情况下第二个条件应该放在第一位。 - Pawan

3

我不确定The MYYN的回答有什么问题。

if (yourString != null) {
  //do fun stuff with yourString here
}

上述的空指针检查是非常好的。

如果您想检查一个字符串引用是否等于(忽略大小写)另一个您知道不是空引用的字符串,那么可以像这样做:

String x = "this is not a null reference"
if (x.equalsIgnoreCase(yourStringReferenceThatMightBeNull) ) {
  //do fun stuff
}

如果你对于你要比较的两个字符串是否存在空引用存在疑问,那么你需要至少在其中一个字符串上进行空引用检查,以避免可能发生的NullPointerException。


2

在你的类中导入它

import org.apache.commons.lang.StringUtils;

然后使用它,它们都将返回true。

System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(null)); 

2

简单方法:

public static boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

2
如果您的字符串具有“null”值,则可以使用以下方法:
if(null == stringName){

  [code]

}

else

[Error Msg]

3
为什么要用 null == stringName 而不是 stringName == null?我认为两者没有区别,但为什么人们更喜欢前者(我经常看到这种写法)。我习惯从左到右阅读,所以喜欢 stringName == null,但我想知道其他人的想法。 - Lukasz 'Severiaan' Grela
8
通常在比较中,你会把变量放在右侧,这样就不会因为错误初始化变量而产生编译错误:null = stringName 会产生编译错误,而 stringName = null 是可行的。 - Sarajog
4
这样做并不是“正常”的,许多人明确禁止这样做,因为对于阅读代码库的人来说,这不是自然的可读形式。 - RichieHH

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