Javaで文字列をnullに対してチェックする方法は?


91

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

stringname.equalsignorecase(null)

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

回答:


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というクラスがあり、nullセーフなString操作を提供します。

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

別の応答は冗談であり、これを行う必要があると述べました:

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

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

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


2
あなたはヨーダバージョンを見逃し、毎回同様に機能します:if( "foo" .equalsIgnoreCase(string))
Omry Yadan

2
わかりやすい説明。素敵に遊んでくれてありがとう。
james.garriss

@aioobe同意すると思いますか?より明確にできる場合は、編集して喜んでください。
Dean J

30
s == null

動作しませんか?


4
@ k38:equals()を比較する場合にのみ使用する必要があります。ただし、変数がかどうかを確認する場合はnull、を使用します==
Felix Kling、

18

もちろん動作します。コードの重要な部分を見逃しています。あなたはこのようにする必要があります:

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

;)


23
ここまで読んだら、@ aioobeが冗談を言っていることを理解してください。このようにしてはいけません。
Dean J

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)

この方法で問題が発生したことはありません。さらに、潜在的なnullポイントの例外を回避しながら、より安全に確認できます。


この場合、NullPointerに注意してください。2番目の条件が最初になります。
Pawan

3

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

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

上記のnullチェックはまったく問題ありません。

文字列参照がnull参照でないことがわかっている別の文字列と等しい(大文字と小文字を区別しない)かどうかを確認する場合は、次のようにします。

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

比較している両方の文字列にnull参照があるかどうか疑わしい場合は、NullPointerExceptionの可能性を回避するために、それらの少なくとも1つでnull参照を確認する必要があります。


2

文字列に「null」値がある場合、使用できます

if(null == stringName){

  [code]

}

else

[Error Msg]

3
なぜnull == stringNameで、stringName == nullではないのですか?私は違いはないと思いますが、なぜこれが好ましいのか(そして私はそれをたくさん見ました)。私の好みは、注文のLTRを読み取ることなので、stringName == nullですが、他の人の考えを知りたいです。
Lukasz 'Severiaan' Grela

7
通常は、変数を右側に配置して、誤って変数を初期化しないようにします。null= stringNameはコンパイルエラーを生成しますが、stringName = nullは可能です
Sarajog

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をスローします。
参照してください、あなたはstringname2つの可能な条件に従う文字列オブジェクトを持っています:-

  1. stringname一部のnull以外の文字列値(「コンピュータ」など):
    コードは、次の形式
    "computer".equalsignorecase(null)
    で期待どおりの応答が得られるため、正常に機能しますfalse
  2. stringnamenull値:
    ここにあなたのコードが動けなくなりますが、など
    null.equalsignorecase(null)
    しかし、一見良いようだと、あなたはと応答を期待してtrue
    しかし、null実行可能なオブジェクトではありませんequalsignorecase()方法を。

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



1

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

if(value.isEmpty());

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


1
(Javaを使用)Scalaのを使用することはif(value.isEmpty())できますNullPointerException。この場合、より適切に使用しますif(value == null)
Andrea

これは、nullの場合は常にNPEをスローするため、間違いです。
Roger


0

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

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

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


nullまたは空白のチェックとはどういう意味ですか?ここではnullのみをチェックしています。ブランクは、「COND?A:B;」の可能なリターンの1つです。構築しますか?
フィロヴィヴェロ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"です。


そうではありません-これは修正ではなく、有用な答えでもありません。
Chris Stratton

「ワット」
フィロヴィヴェロ2014

これは質問の答えにはなりません
ジェイソンアダムス'14年

-2

これを行うには2つの方法があります。SayString == nullまたはstring.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);

    }

}

この例を確認してください。IfElseのショートカットバージョンの別の例を次に示します。


1
番号!.equals()は、nullの可能性があるオブジェクトでは使用しないでください。そのため、導入の説明は誤りです。そして、この回答の残りの部分は無意味であり、尋ねられた質問とは無関係です。
Chris Stratton、2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.