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


91

如何在Java中针对null检查字符串?我在用

stringname.equalsignorecase(null)

但它不起作用。

Answers:


163

string == null比较该对象是否为null。 string.equals("foo")比较该对象内部的值。 string == "foo"并不总是有效,因为您试图查看对象是否相同,而不是它们代表的值。


更长的答案:

如果您尝试这样做,它将无法正常工作,因为您已经发现:

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

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

您可能想要的是:

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

在处理字符串时,防止出现null的典型方法是:

String foo = null;
String bar = "Some string";
...
if (foo != null && foo.equals(bar)) {
    // Do something here.
}

这样,如果foo为null,则不会评估条件的后半部分,一切都很好。

如果使用的是字符串文字(而不是变量),则简单的方法是:

String foo = null;
...
if ("some String".equals(foo)) {
    // Do something here.
}

如果要解决此问题,Apache Commons会提供一个StringUtils类,该类提供空安全的String操作。

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

另一个回应是在开玩笑,说你应该这样做:

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

请不要那样做。您只应为异常错误抛出异常;如果期望空值,则应提前检查它,而不要让它引发异常。

在我看来,有两个原因。首先,例外很慢;检查null的速度很快,但是当JVM引发异常时,这会花费很多时间。其次,如果您只是提前检查空指针,则代码更易于阅读和维护。


2
您错过了Yoda版本,每次都可以使用:if(“ foo” .equalsIgnoreCase(string))
Omry Yadan 2010年

2
不错的有用的解释。感谢您的配合。
james.garriss 2012年

@aioobe我想我们同意吗?如果您可以更清楚一点,很高兴进行编辑。
Dean J

30
s == null

不行吗


4
@ k38:equals()如果要比较值,则只能“使用” 。但是,如果要检查变量是否为变量null,请使用==
菲利克斯·克林

18

当然可以。您错过了代码的重要部分。您只需要这样做:

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

;)


23
如果您到目前为止已经读过,请意识到@aioobe在开玩笑;你不应该这样。
院长J,2010年

12

如果您在Android中工作,请使用TextUtils方法。

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

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

下面是此方法的源代码。您可以使用direclty。

 /**
     * 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;
}

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

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

肯定会导致NullPointerException。

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


4

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

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

这样从来没有任何问题,而且这是一种更安全的检查方式,同时避免了潜在的空点异常。


在这种情况下,要提防NullPointer,第二个条件应该是第一个。
Pawan

3

我不确定MYYN的答案出了什么问题。

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

上面的空检查是完全可以的。

如果您要检查一个String引用是否等于(忽略大小写)与您知道不是null引用的另一个字符串相等,请执行以下操作:

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

如果对正在比较的两个字符串是否都具有空引用存有疑问,则需要检查其中至少一个是否为空引用,以避免NullPointerException的可能性。


2

如果您的字符串的值为“ null”,则可以使用

if(null == stringName){

  [code]

}

else

[Error Msg]

3
为什么null == stringName而不是stringName == null?我认为没有区别,但是为什么要这样做(我已经看了很多)。我的偏好是读取命令LTR,所以stringName == null,但想知道其他人的想法。
Lukasz'Severiaan'Grela 2013年

7
通常,相比之下,您将变量放在右侧,这样就不会在错误时初始化变量:null = stringName会产生编译错误,而stringName = null可能会发生
Sarajog 2013年

4
这样做根本不是“正常的”,许多人明确禁止这样做,因为阅读代码库的人无法自然地理解它。
RichieHH 2014年

2

将其导入您的班级

import org.apache.commons.lang.StringUtils;

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

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

2

您可以使用String == null进行检查

这对我有用

    String foo = null;
    if(foo == null){
        System.out.println("String is null");
    }

1

当然user351809 stringname.equalsignorecase(null)会抛出NullPointerException。
看到,您有一个字符串对象stringname,它遵循2个可能的条件:

  1. stringname具有一些非空的字符串值(例如“ computer”):
    您的代码将采用以下形式
    "computer".equalsignorecase(null)
    ,可以正常工作,并且得到的预期响应为false
  2. stringname具有一个null值:
    在这里,您的代码将被卡住,因为
    null.equalsignorecase(null)
    但是,乍看起来似乎不错,并且您可能希望响应为true
    null它不是可以执行该equalsignorecase()方法的对象。

因此,由于情况2,您将获得例外。
我建议您仅使用stringname == null


1

简单方法:

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

1

如果value返回的为null,请使用:

if(value.isEmpty());

有时if(value == null)在Java中检查null,即使String为null,也可能不会给出true。


1
使用Scala(与Java一起使用)if(value.isEmpty())可得出NullPointerException。在这种情况下,最好使用if(value == null)
Andrea

这绝对是错误的,因为如果为null,它将始终抛出NPE。
罗杰

1

使用Java 7,您可以使用

if (Objects.equals(foo, null)) {
    ...
}

true如果两个参数均为,则返回null


0

我知道很久以前就已经回答了这个问题,但是我还没有看到这个帖子,所以我想分享一下我的工作。这对代码的可读性不是特别好,但是如果您必须进行一系列空检查,我喜欢使用:

String someString = someObject.getProperty() == null ? "" : someObject.getProperty().trim();

在此示例中,在字符串上调用trim,如果字符串为null或空格,则会抛出NPE,但是在同一行上,您可以检查null还是空白,因此不会以一吨(更多)很难格式化(如果有块)。


您是什么意思检查null或空白?您仅在此处检查null。空白是“ COND?A:B;”的可能返回之一。构造对不对?
philo vivero 2014年

0

如果我正确理解,应该这样做:

if(!stringname.isEmpty())
// an if to check if stringname is not null
if(stringname.isEmpy())
// an if to check if stringname is null

-2

好吧,上次有人问这个愚蠢的问题时,答案是:

someString.equals("null")

但是,此“修复”仅隐藏了更大的问题,即如何null成为"null"首位。


事实并非如此,所以这不是一个解决办法,也不是一个有用的答案。
克里斯·斯特拉顿

我想成为第一个说:“笏”
菲洛vivero

这不能回答问题
杰森·亚当斯

-2

有两种方法可以做到。.说String == nullstring.equals() ..

public class IfElse {

    public int ifElseTesting(String a){
        //return null;
        return (a== null)? 0: a.length();
    }

}

public class ShortCutifElseTesting {

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        System.out.println("enter the string please:");
        String a=scanner.nextLine();
        /*
        if (a.equals(null)){
            System.out.println("you are not correct");
        }
        else if(a.equals("bangladesh")){
            System.out.println("you are right");
        }
        else
            System.out.println("succesful tested");

        */
        IfElse ie=new IfElse();
        int result=ie.ifElseTesting(a);
        System.out.println(result);

    }

}

检查此示例。.这是If Else的另一个快捷方式示例。


1
没有!.equals()不得与可能为null的对象一起使用,因此介绍性解释是错误的。这个答案的其余部分似乎毫无意义,并且与提出的问题无关。
克里斯·斯特拉顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.