なみひらブログ

学んだことを日々記録する。~ since 2012/06/24 ~

Java7以降のnullチェックの仕方

背景

メソッドを実装する際、そのメソッドの実行の事前条件を満たしているか確認するため「防御的プログラミング」をする必要があります。その「防御的プログラミング」の例として、「引数のnullチェック」があります。その「引数のnullチェック」の記法についてjava7から改善されたので、その内容について記載します。

Java6以前の記法

Java6以前では以下のようにif文で記載し、メッセージでエラー内容を補足します。

実装例

public class StringUtils{

    /**
     * 指定された2つの文字列の長さの合計を返します
     *
     * @param s1 文字列
     * @param s2 文字列
     * @return 指定された2つの文字列の長さの合計
     *
     * @throws NullPointerException 引数がnullの場合
     */
    public static long sumLength(final String s1, final String s2){
        if (s1 == null || s2 == null) {
            throw new NullPointerException("args must not be null");
        }
        return s1.length() + s2.length();
    }

}

テストコード

null(メソッドとして望まれない値)を入力する

public class StringUtilsTest {

    @Test//(expected = NullPointerException.class)・・・便宜上、スタックトレースを出力するためにエラーにする。
    public void testSumLength_null(){
        // prepare
        // - nothing

        // action
        StringUtils.sumLength(null, null);

        // check
        // - throw Exception
    }
}

スタックトレース

テストを実行すると、スローした例外とメッセージが出力されます。

java.lang.NullPointerException: args must not be null
	at jp.namihira.util.StringUtils.sumLength(StringUtils.java:20)
	at jp.namihira.util.StringUtilsTest.testSumLength_null(StringUtilsTest.java:32)
	(以下、略)

Java7以降の記法

Java7において「Objectsクラス」が導入され、そのクラスの「requireNonNull」を使ってnullチェックを実現できるようになりました。

修飾子と型 メソッドと説明
static T requireNonNull(T obj)
指定されたオブジェクト参照が null でないことを確認します。

※このメソッドは、引数がnullだったらNullPointerExceptionをスローし、nullでない場合は引数objをそのまま返します。

実装例

public class StringUtils{

    /**
     * 指定された2つの文字列の長さの合計を返します
     *
     * @param s1 文字列
     * @param s2 文字列
     * @return 指定された2つの文字列の長さの合計
     *
     * @throws NullPointerException 引数がnullの場合
     */
    public static long sumLength(final String s1, final String s2){
        Objects.requireNonNull(s1);
        Objects.requireNonNull(s2);
        return s1.length() + s2.length();
    }

}

テストコード

上記(java6の例)と同じ

スタックトレース

java.lang.NullPointerException
	at java.util.Objects.requireNonNull(Objects.java:203)
	at jp.namihira.util.StringUtils.sumLength(StringUtils.java:24)
	at jp.namihira.util.StringUtilsTest.testSumLength_null(StringUtilsTest.java:32)
	(以下、略)

requireNonNullのmessageあり版でエラーメッセージを補足できますが、補足しなくても「nullの変数」「行数」が一致するのでデバックしやすい(´・ω・`)b

修飾子と型 メソッドと説明
static T requireNonNull(T obj, String message)
指定されたオブジェクト参照が null でないことを確認し、null の場合はカスタマイズされた NullPointerException をスローします。

参考

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Objects (Java Platform SE 7)