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 |
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 |
requireNonNull(T obj, String message) 指定されたオブジェクト参照が null でないことを確認し、null の場合はカスタマイズされた NullPointerException をスローします。 |
参考
Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング
- 作者: Cay S. Horstmann,柴田芳樹
- 出版社/メーカー: インプレス
- 発売日: 2014/09/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る