文字列が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私のストリングが空であるという事実にもかかわらず、私のプログラムは。と等しいnull。それで、それで何が悪いのですか?

追加:

問題の理由を見つけました。変数が文字列として宣言され、その結果、nullこの変数に割り当てられたものが"null"!つまり、if (!myString.equals("null"))動作します。


2
nullメソッドがないため、メソッドもありませんequals()。もしmyStringあったらnull、どうやってそのメソッドを呼び出すのでしょうか?:)
BalusC 2010

1
System.out.println(myString)何があるか見られるようにifブロックの直前にいることをお勧めしますか?
マイケルマイヤーズ

1
「に等しい」とどうして分かりますかnull
Richard JP Le Guen

6
nullこの変数に割り当てられて変換されました"null"-これはひどい考えです。可能な場合は、このデザインを変更してみてください。
polygenelubricants

8
Yuck-(!myString.equals( "null"))が最善の解決策であるかどうかを確認することはないと思います。ほとんどの場合、文字列「null」がmyStringに割り当てられた時点はバグであると考えられます。
バートF

回答:


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

さらにコメントとして、equals契約ではこの用語に注意する必要があります。

からObject.equals(Object)

null以外の基準値のためxx.equals(null)はずreturn false

と比較する方法nullは、x == nullおよびを使用することx != nullです。

また、x.fieldおよびx.method()スローNullPointerException場合x == null


2
効率を上げるために、イコールではなく長さのチェックを行う必要があります。このリンクをチェックしてくださいhanuska.blogspot.com/2006/08/empty-string.html
CoolBeans

7
読みやすさs.isEmpty()s.length() == 0ためではなく、やるべきだと思います。パフォーマンスの違いはごくわずかです。私はそれs.equals("")がひどいことに同意します。
polygenelubricants

6
読みやすさに同意します。それは)(私たちはのisEmpty以降のJava 6対のJava 5を使用しているかどうかによって異なりだけのJava 6である
CoolBeans

@CoolBeans:良いコメント!気付かなかった!私はJavaパーティーに少し遅れています=)
polygenelubricants

26

場合myStringnull、その後、呼び出しmyString.equals(null)たりmyString.equals("")して失敗しますNullPointerException。null変数でインスタンスメソッドを呼び出すことはできません。

最初に次のようにnullを確認します。

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

これは、短絡評価を利用して、nullチェックに失敗した.equalsifを試行しないようにmyStringします。


短絡の場合は+1。式が機能するために不可欠です。ただし、実際にはの.isEmpty()代わりに使用する必要があります.equals("")
polygenelubricants

1
わかりました、この投稿にコメントを残すつもりです。笑。-> "効率を上げるためには、イコールではなく長さのチェックを行う必要があります。このリンクを確認してくださいhanuska.blogspot.com/2006/08/empty-string.html"
CoolBeans

@CoolBeans:もちろん、Java 6を使用すれば実行することもできますmyString.isEmpty()。しかし、このレベルでは、可読性は最適化よりも優先され、人々は読書に慣れている可能性がありますmyString.equals("")。(または場合によってはそうではない。)
マイケルマイヤーズ


13

myStringが実際にnullの場合、参照への呼び出しはすべてNullポインタ例外(NPE)で失敗します。Java 6以降では、長さチェックの代わりに#isEmptyを使用してください(どのような場合でも、チェックで新しい空の文字列を作成しないでください)。

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

ちなみに、あなたがそうするように文字列リテラルと比較する場合、nullチェックをする必要がないようにステートメントを逆にします、すなわち、

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

の代わりに :

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

1
良い点ですが、最後の2つのifは同等ではありません。myString = "abc"の場合、真ん中のものはdoSomethingを呼び出さず、3番目のものは呼び出します。
rimsky 2013年

修正された
@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

4
myStringがnullの場合、これはほぼ可能です。あなたは&&の左側の一部に障害が発生した場合、右側の式はすべて...で評価されないことを知るべきである
bragboy


4

文字列を処理する必要があるたびに(ほとんど毎回)、停止して、空の文字列を確認する最も速い方法はどちらなのかと思います。もちろん、Lengthはプロパティであるため、string.Length == 0のチェックが最も速く、プロパティの値を取得する以外の処理はありません。しかし、私は自分自身に尋ねます、なぜString.Emptyがあるのですか?String.Emptyをチェックする方が長さをチェックするより速いはずです。さて、私は最終的にそれをテストすることに決めました。小さなWindowsコンソールアプリをコーディングして、1,000万回の繰り返しに対して特定のチェックを実行するのにかかる時間を教えてくれました。NULL文字列、空の文字列、 ""文字列の3つの異なる文字列を確認しました。5つの異なるメソッドを使用しました:String.IsNullOrEmpty()、str == null、str == null || str == String.Empty、str == null || str == ""、str == null || str。

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.Emptyまたはstr = ""、結果はfalseになります。次に、2番目に結びついている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、空、または空白のみ。

これはこれまでのところ最高です

これがドキュメントの元のメソッドです

/**
    * 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が逆になっています。nullオブジェクトのメソッドを呼び出すと、NPEが返されます
Brian

文字列がnullの場合、nullかどうかを確認する前であっても、nullポインタ例外が発生します。このコードは絶対に使用しないでください!
gil.fernandes 2017年

2

これは、Javaでのデータ型の動作方法です。(あなたは私の英語を許しなければなりません、私はおそらく正しいボキャブを使用していません。それらの2つを区別する必要があります。基本データ型と通常のデータ型。基本データ型は、存在するすべてのものをかなり構成します。たとえば、通常のデータ型または複合データ型は他のすべてです。文字列は文字の配列なので、複合データ型です。

作成するすべての変数は、実際にはメモリ内の値へのポインタです。例えば:

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

変数「s」には文字列が含まれていません。ポインターです。このポインタは、メモリ内の変数を指します。を呼び出すとSystem.out.println(anyObject)toString()そのオブジェクトのメソッドが呼び出されます。toStringObjectからオーバーライドしなかった場合は、ポインターを出力します。例えば:

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.equals(String other)はコンテンツを比較します。同じ内容の2つの異なるオブジェクトのポインターが等しいため、プリミティブデータ型を '=='演算子で比較できます。

nullは、ポインタが空であることを意味します。デフォルトの空のプリミティブデータ型は0(数値の場合)です。ただし、複雑なオブジェクトのnullは、そのオブジェクトが存在しないことを意味します。

ご挨拶


2

私にとって、Javaで文字列に意味のあるコンテンツがあるかどうかを確認するには、次のようにします。

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

最初に、文字列がnull避けるべきものかどうかを確認しNullPointerException、次に空白のみを含む文字列を確認しないようにすべてのスペース文字をトリミングし、最後に、トリミングされた文字列が空ではない、つまり長さが0かどうかを確認します。


1

私はアンドロイドでこの問題があり、私はこのように使用しています(私のために働きます):

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

アンドロイドでは、ユーティリティメソッドでこれを確認することができます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の場合

または、それがnullのときにtry catchおよびcatchを使用できます。


0

myStringは文字列ではなく、文字列の配列だと思います。これはあなたがする必要があることです:

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

私のコードは処理用です。処理は、Javaベースのプログラミング言語です。結合に関する詳細情報:processing.org/reference/join_.html
15年

0

これを使用して、nullと等しい文字列を確認できます。

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

結果が0の場合、(Test + "")= "null"です。


これは単に不要な文字列を作成する
svarog

0

私は上記の例のほとんどをAndroidアプリのnullで試してみましたが、ビルド中にITがすべて失敗しました。だから私はいつでもうまくいく解決策を思いついた。

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

}

したがって、上記のlのように空の文字列を連結し、「null」に対してテストすれば、正常に機能します。実際には例外はスローされません


1
いいえ、それは絶対にひどい解決策です。上記の答えが機能します。
Konrad Rudolph

@KonradRudolph実際に結論を出す前に、上記の解決策のいくつかを実際に試しました。私はこれらのソリューションをrecyclerviewアダプターで使用してみましたが、この答えが出るまで正しい結果が得られませんでした。
leeCoder 2016

これは、コードに何か他の問題があり、単にエラーの原因ではなく、症状を修正していることを意味していると自信を持って言えます。これを間違った方法で行わないでください。ただし、これはカーゴカルトプログラミングの典型的な例です。
Konrad Rudolph、


0

Androidで作業している場合は、単純なTextUtilsクラスを使用できます。次のコードを確認してください。

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

これはコードの簡単な使い方です。答えは繰り返されるかもしれません。しかし、あなたのために単一で簡単なチェックをするのは簡単です。


-5

nullで確認する必要があります if(str != null).


5
あなたの解決策は何年も前に他のユーザーによって投稿されました...それを繰り返すことの意味は何ですか?
TDG、2016年

1
私は答えが確認されていないことを確認しました。それが私が彼に返信する理由です
rawa rawandze

6
そうです、彼は2010年以来回答を確認していません。そのため、前の回答を繰り返すだけで、彼はあなたの回答を確認します...
TDG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.