JavaでNULL判定・空文字判定をおこなう場合に注意するポイント

Java

Javaで文字列のNULL判定や空文字判定をおこなう場合、判定ロジックに気を付けないと思いもよらない例外が発生する場合があります。

今回は、NULL判定や空文字判定をおこなう場合の注意すべきポイントをサンプルプログラム付きで説明していきます。


環境情報


  • Java:Java1.8.0_281

NULL判定


文字列の比較はStringクラスのequalsを使用しますが、equalsメソッドを使用する変数を比較元にするか?もしくは、比較先にする?によって、例外の発生パターンが異なってきます。

public class NullSample {

    // NULLの定数
    private static String DEFINE_NULL = null;

    // 空文字の定数
    private static String DEFINE_KARA = "";

    public static void main(String[] args){
        System.out.print("start: main\r\n");


        /*------------------------------------------*/
        /* NULL判定                             */
        /*------------------------------------------*/

        // 1.NULL判定/定数が左側
        try {
            String val = "abc";
            if (DEFINE_NULL.equals(val)) {
                System.out.print("val is null \r\n");
            } else {
                System.out.print("val is not null \r\n");
            }
        } catch (Exception e) {
            System.out.print("NULL判定で例外!定数が左側 \r\n");
        }

        // 2.NULL判定/定数が右側
        try {
            String val = "abc";
            if (val.equals(DEFINE_NULL)) {
                System.out.print("val is null \r\n");
            } else {
                System.out.print("val is not null \r\n");
            }
        } catch (Exception e) {
            System.out.print("NULL判定で例外!定数が右側 \r\n");
        }
        System.out.print("end: main\r\n");
    }
}

プログラムの実行結果は以下になります。


start: main
NULL判定で例外が発生!定数が左側  ← 1の判定結果
val is not null                    ← 2の判定結果
end: main

1の判定について、例外が発生しています。
equalsメソッドを使用するオブジェクト自体がNULLの場合は例外が発生するということがわかります。


そのため、実際のプログラムでは、NULLが格納される可能性のある変数ではequalsメソッドは使用しないことが推奨されます。


空文字判定


次は空文字の判定についてです。
サンプルプログラムで動きを確認してみます。


public class KaraSample {

    // NULLの定数
    private static String DEFINE_NULL = null;

    // 空文字の定数
    private static String DEFINE_KARA = "";

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        /*------------------------------------------*/
        /* 空判定                             */
        /*------------------------------------------*/

        // 1.空判定/定数が左側
        try {
            String val = "abc";
            if (DEFINE_KARA.equals(val)) {
                System.out.print("val is kara \r\n");
            } else {
                System.out.print("val is not kara \r\n");
            }
        } catch (Exception e) {
            System.out.print("空判定で例外が発生!定数が左側 \r\n");
        }

        // 2.空判定/定数が右側
        try {
            String val = "abc";
            if (val.equals(DEFINE_KARA)) {
                System.out.print("val is kara \r\n");
            } else {
                System.out.print("val is not kara \r\n");
            }
        } catch (Exception e) {
            System.out.print("空判定で例外が発生!定数が右側 \r\n");
        }
        System.out.print("end: main\r\n");
    }
}

val is not kara    ← 1の判定結果
val is not kara    ← 2の判定結果

1と2のどちらの方法であっても、例外が発生せずに空文字判定をおこなうことができています。


上記のサンプルプログラムは、判定結果が空文字ではないという結果になっていますが、試しに空文字での判定をおこなってみます。


public class KaraSample {

    // NULLの定数
    private static String DEFINE_NULL = null;

    // 空文字の定数
    private static String DEFINE_KARA = "";

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        /*------------------------------------------*/
        /* 空判定                             */
        /*------------------------------------------*/

        // 1.空判定/定数が左側
        try {
            String val = "";
            if (DEFINE_KARA.equals(val)) {
                System.out.print("val is kara \r\n");
            } else {
                System.out.print("val is not kara \r\n");
            }
        } catch (Exception e) {
            System.out.print("空判定で例外が発生!定数が左側 \r\n");
        }

        // 2.空判定/定数が右側
        try {
            String val = "";
            if (val.equals(DEFINE_KARA)) {
                System.out.print("val is kara \r\n");
            } else {
                System.out.print("val is not kara \r\n");
            }
        } catch (Exception e) {
            System.out.print("空判定で例外が発生!定数が右側 \r\n");
        }
        System.out.print("end: main\r\n");
    }
}

val is kara    ← 1の判定結果
val is kara    ← 1の判定結果

正常に、空文字の判定がおこなわれて結果も正常であることがわかります。