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


172

仅当我的字符串具有有意义的值时,我才想执行一些操作。所以,我尝试了这个。

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,尽管我的字符串为EMPTY,但我的程序仍然有效。等于null。那么,这有什么问题呢?

添加:

我找到了问题的原因。该变量被声明为字符串,结果,null分配给该变量的结果变为"null"!因此,if (!myString.equals("null"))作品。


2
null没有任何方法,所以也没有equals()。如果myStringnull,您将如何在其上调用方法?:)
BalusC,2010年

1
我可以建议您System.out.println(myString)在if块之前,这样您可以查看其中的内容吗?
迈克尔·迈尔斯

1
您怎么知道“等于null”?
理查德JP Le Guen

6
null分配给该变量的对象被转换为"null"-这是一个可怕的想法。尽可能尝试更改此设计。
polygenelubricants 2010年

8
uck-我不认为检查(!myString.equals(“ null”))是否是最佳解决方案。我怀疑大多数人会认为将字符串“ null”分配给myString的那一点是一个错误。
Bert F

Answers:


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

作为进一步的评论,您应该注意equals合同中的这一条款:

来自Object.equals(Object)

对于任何非null的参考值xx.equals(null)应使用return false

与之比较的方法null是使用x == nullx != null

此外,x.fieldx.method()抛出NullPointerException如果x == null


2
为了效率起见,您应该进行长度检查,而不是等长检查。检查此链接hanuska.blogspot.com/2006/08/empty-string.html
CoolBeans 2010年

7
我想说,您应该这样做s.isEmpty()而不是s.length() == 0为了提高可读性。性能上的任何差异都可以忽略不计。我同意那s.equals("")是可怕的。
polygenelubricants 2010年

6
我同意可读性。这取决于我们是否使用Java 5 vs Java 6,因为isEmpty()仅适用于
Java6。– CoolBeans 2010年

@CoolBeans:好评论!我还没意识到!我参加Java晚会有点晚=)
polygenelubricants 2010年

26

如果myStringnull,则调用myString.equals(null)myString.equals("")将失败,并出现NullPointerException。您不能在null变量上调用任何实例方法。

首先检查null是否是这样的:

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

这将利用短路评估来避免.equalsif myString检查失败。


+1表示短路;这对于表达式的工作至关重要。但是,您确实应该使用.isEmpty()代替.equals("")
polygenelubricants 2010年

1
好吧,我想对这个帖子发表评论。大声笑。->“为了效率起见,您应该进行长度检查而不是等长检查。请检查此链接hanuska.blogspot.com/2006/08/empty-string.html”
CoolBeans 2010年

@CoolBeans:当然,使用Java 6甚至可以做到myString.isEmpty()。但是在这个级别上,可读性胜过优化,人们可能更习惯于阅读myString.equals("")。(或可能不会。)
迈克尔·迈尔斯

20

Apache Commons StringUtils.isNotEmpty是最好的选择。


13

如果myString实际上为null,则对引用的任何调用都将失败,并出现Null Pointer Exception(NPE)。从Java 6开始,请使用#isEmpty而不是长度检查(在任何情况下都不要创建带有检查的新空字符串)。

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

顺便说一句,如果您与String文字进行比较,则会颠倒该语句,从而不必进行空检查,即,

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

代替 :

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

1
好点,但最后两个if不相等。使用myString =“ abc”,中间的一个不调用doSomething,但是第三个则调用doSomething。
rimsky

已修复的
@rimsky


6

您需要检查myString对象是否为null

if (myString != null) {
    doSomething
}

5

如果您的字符串为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();
}

5

我鼓励使用现有的实用程序或创建自己的方法:

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

然后在需要时使用它:

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

如上所述,|| 和&&操作员短路。这意味着一旦他们确定了自己的价值,他们就会停止。因此,如果(string == null)为true,则不需要计算长度部分,因为表达式始终为true。与&&相似,如果左侧为false,则表达式始终为false,无需进一步求值。

另外需要注意的是,使用长度通常比使用.equals更好。性能稍微好一些(不是很多),并且不需要创建对象(尽管大多数编译器可能会对此进行优化)。


4

尝试,

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

如果myString为null,则这是不可能的
hsmit 2011年

4
当myString为null时,这很有可能。你应该知道,当&&左侧部分失败,正确的表达不会被所有..评估
bragboy


4

每当我不得不处理字符串(几乎每次)时,我都会停下来想知道哪种方法确实是检查空字符串的最快方法。当然,string.Length == 0检查应该是最快的,因为Length是一个属性,除了检索该属性的值外,不应进行任何处理。但是然后我问自己,为什么会有String.Empty?我告诉自己,检查String.Empty应该比检查长度更快。好吧,我最终决定对其进行测试。我编写了一个小型Windows控制台应用程序,该应用程序告诉我对一千万个表述进行特定检查需要多长时间。我检查了3个不同的字符串:NULL字符串,Empty字符串和“”字符串。我使用了5种不同的方法:String.IsNullOrEmpty(),str == null,str == null || str == String.Empty,str == null || str ==“”,str == null || 海峡

String.IsNullOrEmpty()
NULL = 62 milliseconds
Empty = 46 milliseconds
"" = 46 milliseconds

str == null
NULL = 31 milliseconds
Empty = 46 milliseconds
"" = 31 milliseconds

str == null || str == String.Empty
NULL = 46 milliseconds
Empty = 62 milliseconds
"" = 359 milliseconds

str == null || str == ""
NULL = 46 milliseconds
Empty = 343 milliseconds
"" = 78 milliseconds

str == null || str.length == 0
NULL = 31 milliseconds
Empty = 63 milliseconds
"" = 62 milliseconds

根据这些结果,平均检查 str == null速度最快,但不一定总能得到我们想要的结果。if str = String.Emptystr = "",结果为false。然后,您有2个并列第二:String.IsNullOrEmpty()str == null || str.length == 0。由于String.IsNullOrEmpty()看起来更好,更容易(更快)编写,因此我建议在其他解决方案上使用它。


3

我会做这样的事情:

( myString != null && myString.length() > 0 )
    ? doSomething() : System.out.println("Non valid String");
  • 测试null会检查myString是否包含String的实例。
  • length()返回长度,并等于equals(“”)。
  • 首先检查myString是否为null将避免NullPointerException。

3

我一直在使用 StringUtil.isBlank(string)

它测试字符串是否为空白:null,emtpy或仅​​空白。

所以这是迄今为止最好的

这是来自文档的原始方法

/**
    * Tests if a string is blank: null, emtpy, or only whitespace (" ", \r\n, \t, etc)
    * @param string string to test
    * @return if string is blank
    */
    public static boolean isBlank(String string) {
        if (string == null || string.length() == 0)
            return true;

        int l = string.length();
        for (int i = 0; i < l; i++) {
            if (!StringUtil.isWhitespace(string.codePointAt(i)))
                return false;
        }
        return true;
    } 

2

这应该工作:

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

如果不是,则myString可能具有您不期望的值。尝试像这样打印出来:

System.out.println("+" + myString + "+");

使用“ +”符号将字符串括起来会显示您是否在考虑不了多余的空格。


2

if(str.isEmpty() || str==null){ do whatever you want }


3
isEmpty是反向的..如果在空对象上调用方法,则会得到NPE
Brian

如果字符串为null,则即使在检查它为null之前,也会得到null指针异常。永远不要使用此代码!
gil.fernandes

2

好的,这就是Java中数据类型的工作方式。(您必须原谅我的英语,我很可能没有使用正确的词汇。您必须区分它们两种。基本数据类型和普通数据类型。基本数据类型几乎可以构成所有存在的内容。例如,普通数据类型或复杂数据类型是其他所有内容,字符串是字符数组,因此是复杂数据类型。

您创建的每个变量实际上都是内存中值的指针。例如:

String s = new String("This is just a test");

变量“ s”不包含字符串。它是一个指针。该指针指向内存中的变量。调用时System.out.println(anyObject),将调用toString()该对象的方法。如果未toString从Object 覆盖,它将打印指针。例如:

public class Foo{
    public static void main(String[] args) {
        Foo f = new Foo();
        System.out.println(f);
    }
}

>>>>
>>>>
>>>>Foo@330bedb4

“ @”后面的所有内容都是指针。这仅适用于复杂的数据类型。基本数据类型直接保存在其指针中。因此实际上没有指针,并且值直接存储。

例如:

int i = 123;

在这种情况下,我不存储指针。我将存储整数值123(以字节为单位)。

好吧,让我们回到 ==操作员手中。它总是比较指针,而不是比较指针在内存中保存的内容。

例:

String s1 = new String("Hallo");
String s2 = new String("Hallo");

System.out.println(s1 == s2);

>>>>> false

这两个String具有不同的指针。但是String.equals(String other)比较内容。您可以使用'=='运算符来比较原始数据类型,因为具有相同内容的两个不同对象的指针相等。

Null表示指针为空。默认情况下,空的原始数据类型为0(用于数字)。但是,对于任何复杂对象,如果为null,则表示该对象不存在。

问候


2

对我来说,最好的检查字符串在Java中是否有任何有意义的内容是:

string != null && !string.trim().isEmpty()

首先,检查是否null要避免使用字符串NullPointerException,然后修剪所有空格字符,以避免检查仅包含空格的字符串,最后检查修剪后的字符串是否不为空,即长度为0。


1

我在android中遇到了这个问题,我使用这种方式(为我工作):

String test = null;
if(test == "null"){
// Do work
}

但是在Java代码中我使用:

String test = null;
if(test == null){
// Do work
}

和:

private Integer compareDateStrings(BeanToDoTask arg0, BeanToDoTask arg1, String strProperty) {
    String strDate0 = BeanUtils.getProperty(arg0, strProperty);_logger.debug("strDate0 = " + strDate0);
    String strDate1 = BeanUtils.getProperty(arg1, strProperty);_logger.debug("strDate1 = " + strDate1);
    return compareDateStrings(strDate0, strDate1);
}

private Integer compareDateStrings(String strDate0, String strDate1) {
    int cmp = 0;
    if (isEmpty(strDate0)) {
        if (isNotEmpty(strDate1)) {
            cmp = -1;
        } else {
            cmp = 0;
        }
    } else if (isEmpty(strDate1)) {
        cmp = 1;
    } else {
        cmp = strDate0.compareTo(strDate1);
    }
    return cmp;
}

private boolean isEmpty(String str) {
    return str == null || str.isEmpty();
}
private boolean isNotEmpty(String str) {
    return !isEmpty(str);
}


1

在Android中,您可以使用实用程序方法isEmpty从中进行检查TextUtils

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

isEmpty(CharSequence str)方法检查条件,null长度和长度。


1

我总是这样使用:

if (mystr != null && !mystr.isEmpty()){
  //DO WHATEVER YOU WANT OR LEAVE IT EMPTY
}else {
  //DO WHATEVER YOU WANT OR LEAVE IT EMPTY
}

或者您可以将其复制到您的项目中:

private boolean isEmptyOrNull(String mystr){
    if (mystr != null && !mystr.isEmpty()){ return true; }
    else { return false; }
}

然后像这样调用它:

boolean b = isEmptyOrNull(yourString);

如果为空或为null,它将返回true。
b=true如果为空或为null

或者,您可以使用try catch并在它为null时捕获。


0

我认为myString不是字符串,而是字符串数组。这是您需要做的:

String myNewString = join(myString, "")
if (!myNewString.equals(""))
{
    //Do something
}

我的代码正在处理。处理是一种基于Java的编程语言。有关join的更多信息:processing.org/reference/join_.html
模仿

0

您可以使用以下命令检查等于null的字符串:

String Test = null;
(Test+"").compareTo("null")

如果结果为0,则(Test +“”)=“ null”。


这只会创建一个不必要的字符串
svarog

0

我在上面正在构建的android应用程序中尝试了上面给出的大多数示例来获取null,并且一切都失败了。所以我想出了一个对我来说随时可用的解决方案。

String test = null+"";
If(!test.equals("null"){
       //go ahead string is not null

}

因此,只需像上面l那样连接一个空字符串,并测试“ null”,它就可以正常工作。实际上没有抛出异常


1
不,那是绝对糟糕的解决方案。以上答案有效。
康拉德·鲁道夫

@KonradRudolph在得出结论之前,我实际上尝试了上述一些解决方案。我尝试在recyclerview适配器中使用这些解决方案,直到我想出这个答案,它才给我正确的结果。
leeCoder

我可以自信地说,这意味着您的代码还有其他问题,而您只是在解决问题,而不是错误的根源。不要以错误的方式采取这种做法,但这是典型的“ 货物崇拜”编程案例。
康拉德·鲁道夫

0

异常可能也有帮助:

try {
   //define your myString
}
catch (Exception e) {
   //in that case, you may affect "" to myString
   myString="";
}

0

如果您使用的是Android,则可以使用简单的TextUtils类。检查以下代码:

if(!TextUtils.isEmpty(myString)){
 //do something
}

这是简单的代码用法。答案可能会重复。但是为您进行一次简单的检查很简单。


-5

您必须检查null if(str != null).


5
您的解决方案是几年前由其他用户发布的...重复它的意义是什么?
TDG

1
我没有答案得到证实,这就是为什么我给他答复
Rawa rawandze '16

6
是的,他从2010年以来一直没有确认答案,因此您只需重复上一个答案,他就会确认您的答案……
TDG 2016年
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.