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

Rom*_*man 166 java string null equals conditional-operator

我想只在我的字符串有一个有意义的值时执行一些操作.所以,我试过这个.

if (!myString.equals("")) {
doSomething
}
Run Code Online (Sandbox Code Playgroud)

还有这个

if (!myString.equals(null)) {
doSomething
}
Run Code Online (Sandbox Code Playgroud)

还有这个

if ( (!myString.equals("")) && (!myString.equals(null))) {
doSomething
}
Run Code Online (Sandbox Code Playgroud)

还有这个

if ( (!myString.equals("")) && (myString!=null)) {
doSomething
}
Run Code Online (Sandbox Code Playgroud)

还有这个

if ( myString.length()>0) {
doSomething
}
Run Code Online (Sandbox Code Playgroud)

在所有情况下,我的程序doSomething尽管我的字符串是空的.它等于null.那么,那有什么问题?

添加:

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

pol*_*nts 226

if (myString != null && !myString.isEmpty()) {
  // doSomething
}
Run Code Online (Sandbox Code Playgroud)

作为进一步的评论,您应该知道equals合同中的这个术语:

来自Object.equals(Object):

对于任何非空引用值x,x.equals(null)应该return false.

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

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

  • 我会说你应该做`s.isEmpty()`而不是`s.length()== 0`以提高可读性.任何性能差异都可以忽略不计.我确实同意`s.equals("")`太可怕了. (7认同)
  • 我同意可读性.这取决于我们是使用Java 5还是Java 6,因为isEmpty()仅在Java 6中使用. (6认同)
  • 出于效率目的,您应该进行长度检查而不是等于.请访问此链接http://hanuska.blogspot.com/2006/08/empty-string.html (2认同)

Mic*_*ers 26

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

首先检查null,如下所示:

if (myString != null && !myString.equals("")) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

这使得短路评估不会尝试.equalsif myString无效的空检查.


小智 19

Apache commons StringUtils.isNotEmpty是最好的方式.

  • 或 StringUtils.isEmpty() 用于检查字符串是否为 Null/Empty (2认同)

小智 10

如果myString实际上为null,那么对引用的任何调用都将失败并出现Null Pointer Exception(NPE).从java 6开始,使用#isEmpty而不是length检查(在任何情况下都不要使用check创建一个新的空String).

if (myString !=null &&  !myString.isEmpty()){
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

顺便提一下,如果像你一样比较字符串文字,则会反转语句,以便不必进行空检查,即

if (("some string to check").equals(myString)){
  doSomething();
} 
Run Code Online (Sandbox Code Playgroud)

代替 :

if (myString !=null &&  !myString.equals("some string to check")){
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)


Sal*_*zir 7

工作!!!!

if (myString != null && !myString.isEmpty()) {
    return true;
}
else {
    return false;
}
Run Code Online (Sandbox Code Playgroud)


Whi*_*ind 6

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

if (myString != null) {
    doSomething
}
Run Code Online (Sandbox Code Playgroud)


bra*_*boy 5

尝试,

myString!=null && myString.length()>0
Run Code Online (Sandbox Code Playgroud)

  • 当 myString 为 null 时,这几乎是可能的。您应该知道,当 && 的左侧部分失败时,右侧表达式根本不会被求值。 (5认同)

And*_*ite 5

如果您的字符串为null,那么这样的调用应该抛出NullReferenceException:

myString.equals(空)

但无论如何,我认为这样的方法是你想要的:

public static class StringUtils
{
    public static bool isNullOrEmpty(String myString)
    {
         return myString == null || "".equals(myString);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

if (!StringUtils.isNullOrEmpty(myString))
{
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*d H 5

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

        // your magic here

 }
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您要进行大量字符串操作,那么有一个很棒的 Spring 类,其中包含各种有用的方法:

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/util/StringUtils.html


Mat*_*att 5

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

public static boolean isEmpty(String string) {
    return string == null || string.length() == 0;
}
Run Code Online (Sandbox Code Playgroud)

然后在需要时使用它:

if (! StringUtils.isEmpty(string)) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

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

作为附加说明,使用长度通常比使用 .equals 更好。性能稍微好一些(不多),并且不需要创建对象(尽管大多数编译器可能会对此进行优化)。


小智 5

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

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
Run Code Online (Sandbox Code Playgroud)

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