Help us understand the problem. What is going on with this article?

Java / 文字列と変数の比較でヌルポになるのを避ける

やりたいこと

DBが取得したフラグのようなものを条件分岐する場合、以下のようなコードを書きがち。

class Playground {
    public static void main(String[ ] args) {

        //DBから取得したデータだとする
        String item_flag = "0";

        if(item_flag.equals("0")){
            System.out.println("通常品");
        }
    }
}

ただし、item_flagにnullが入った場合は、

class Playground {
    public static void main(String[ ] args) {

        String item_flag = null;

        if(item_flag.equals("0")){
            System.out.println("通常品");
        }
    }
}

NullPointerExceptionで例外が発生する

解決方法

比較を逆にする

条件式を逆にしてあげれば、NullPointerExceptionになることはない。

class Playground {
    public static void main(String[ ] args) {

        String item_flag = null;

        if("0".equals(item_flag)){
            System.out.println("通常品");
        }
    }
}

素直にnull判定する

class Playground {
    public static void main(String[ ] args) {

        String item_flag = null;

        if(item_flag != null && item_flag.equals("0")){
            System.out.println("通常品");
        }
    }
}

Objects.equalsを使う

Objects.equalsを使うと、NullPointerExceptionを発生せず、正しく値を比較できる。
[コメントでご教示いただいたので追記しました]

class Playground {
    public static void main(String[ ] args) {

        String item_flag = null;

        if(Objects.equals(item_flag,"0"){
            System.out.println("通常品");
        }
    }
}

その他の例

そのほかにも、Optionalで包むとかStringUtilsを使うなどがあります。
詳しくはコメント欄をご覧ください:point_up:

まとめ

"0"はStringでかつ、不変でnullになることはありえないが、item_flagは可変で、nullになる可能性がある。
nullに.equalsを生やすと、上記のようにNullPointerExceptionが発生する可能性がある。

以上のことを注意し、Objects.equalsを積極的に利用する。
または、nullになり得ない変数に.equalsを生やすか、null判定を先に実行すること。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした