web-dev-qa-db-ja.com

Javaでnullに対して文字列をチェックするにはどうすればよいですか?

Javaでnullに対して文字列をチェックするにはどうすればよいですか?使ってます

stringname.equalsignorecase(null)

しかし、それは機能していません。

84
user351809

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には、nullセーフな文字列操作を提供するクラス- StringUtils -があります。

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

別の応答は冗談でした、そして、あなたはこれをするべきだと言いました:

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

しないでください。例外的なエラーに対してのみ例外をスローする必要があります。 nullを期待している場合は、事前にそれを確認し、例外をスローさせないようにする必要があります。

私の頭の中には、これには2つの理由があります。まず、例外は遅いです。 nullに対するチェックは高速ですが、JVMが例外をスローすると、多くの時間がかかります。第二に、事前にヌルポインターをチェックするだけで、コードの読み取りと保守がはるかに簡単になります。

153
Dean J
s == null

動作しませんか?

28
miku

確かに動作します。コードの重要な部分を見逃しています。次のようにするだけです。

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

;)

17
aioobe

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;
    }
9
Kishan Vaghela

EqualsIgnoreCaseメソッドの実装を見ると、次の部分が見つかります。

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

そのため、引数がfalseの場合、常にnullを返します。そして、これは明らかに正しいです。なぜなら、trueを返す必要があるのは、null StringでequalsIgnoreCaseが呼び出されたときだけですが、

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

間違いなくNullPointerExceptionが発生します。

したがって、equalsメソッドは、nullで呼び出せないという理由だけで、オブジェクトがnullかどうかをテストするようには設計されていません。

5
Andreas_D

これは少し奇妙に見えますが、...

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

この方法で問題が発生したことはありません。さらに、潜在的なヌルポイント例外を回避しながらチェックするのがより安全な方法です。

4
Timothy Perez

The MYYNの答えが何が悪かったのかわかりません。

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

上記のヌルチェックは大丈夫です。

文字列参照が、大文字と小文字を区別せずに、knowがnull参照ではない別の文字列と等しいかどうかを確認する場合は、次のようにします。

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

比較する両方の文字列にnull参照があるかどうかに疑問がある場合は、NullPointerExceptionの可能性を回避するために、少なくとも一方のnull参照を確認する必要があります。

3
whaley

文字列が「null」値を持っている場合は、使用できます

if(null == stringName){

  [code]

}

else

[Error Msg]
2
User_86

クラスにインポートします

import org.Apache.commons.lang.StringUtils;

それを使用すると、両方ともtrueを返します

System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(null)); 
2
Khalid Habib

String == nullで確認できます

これは私のために働く

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

簡単な方法:

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

もちろんuser351809、stringname.equalsignorecase(null)はNullPointerExceptionをスローします。
参照してください、2つの可能な条件に従う文字列オブジェクトstringnameがあります。

  1. stringnameには、null以外の文字列値(「コンピューター」など)があります。
    次の形式を取るため、コードは正常に機能します。
    "computer".equalsignorecase(null)
    そして、falseとして期待される応答を取得します。
  2. stringnameにはnull値があります:
    ここで、コードがスタックします。
    null.equalsignorecase(null)
    ただし、一見したところ上手く思えるので、trueとしての応答を期待できます。
    しかし、nullequalsignorecase()メソッドを実行できるオブジェクトではありません。

したがって、ケース2により例外が発生します。
stringname == nullを使用することをお勧めします

1
Satyendra

返されるvalueがnullの場合、次を使用します。

if(value.isEmpty());

Javaでif(value == null)のnullをチェックするとき、Stringがnullであってもtrueにならない場合があります。

1

Java 7では、次を使用できます

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

両方のパラメーターがtrueの場合、nullを返します。

0
Roland Ettinger

これはかなり前に回答されたことに気づきましたが、これが投稿されたのを見たことがないので、私は自分がしていることを共有したいと思いました。これはコードの可読性には特に適していませんが、一連のヌルチェックを行う必要がある場合は、次のように使用します。

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

この例では、文字列に対してtrimが呼び出され、文字列がnullまたはスペースである場合にNPEがスローされますが、同じ行でnullまたは空白をチェックして、( )ifブロックのフォーマットは困難です。

0
Reese