Javaのnullチェックでif文を使いたくない(個人的には解決)

nullチェックの実装で悩んでいた。

Javaのnullチェックでif文を使いたくない(解決せず) - ikhrのブログ

OpenJDKのソースを見ていてふとjava.util.Objectsの存在を知る。

java.util.ObjectsはJava 7に追加されたクラス。

試してみた。

       // ----- ここから -----
        // 何らかの処理の戻りにnullが含まれていると仮定
        ParentBean parentBean = new ParentBean();
        parentBean.setChildBean(null);
        // 実利用ではアノテーションでメソッド処理のタイミングでnullだったらExceptionをthrowする。みたいな実装にしたい。
        try {
            validateDeepNull(parentBean);
        } catch (ExtendedException e) {
            // "java.lang.NullPointerException: "がMessageに含まれている。
            throw e;
        }
        // ----- ここまでは隠したい実装 -----

        // 本処理
        System.out.println(parentBean.getChildBean().getGrandChildBean().getName());
   /**
    * ObjectとObject内のフィールドのnullチェックを行います。<br/>
    * ※リフレクションは個々の実装での使用は控えましょう。
    *
    * @param obj
    *            Object
    * @throws ExtendedException
    *             Object、Object内のフィールドでnullを検知した場合throwする
    */
    private static void validateDeepNull(Object obj) throws ExtendedException {
        // objのnullチェック
        try {
            Objects.requireNonNull(obj, "obj is null!");
        } catch (NullPointerException e) {
            throw new ExtendedException(e);
        }

        // obj内のフィールドのnullチェック
        Class<? extends Object> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                Objects.requireNonNull(field.get(obj), field.getName() + " is null!!");
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            } catch (NullPointerException e) {
                throw new ExtendedException(e);
            }
        }
    }

Exceptionイメージ

TestNull$ExtendedException: java.lang.NullPointerException: obj is null!
    at TestNull.validateDeepNull(TestNull.java:114)
    at TestNull.example3(TestNull.java:69)
    at TestNull.main(TestNull.java:14)
Caused by: java.lang.NullPointerException: obj is null!
    at java.util.Objects.requireNonNull(Objects.java:228)
    at TestNull.validateDeepNull(TestNull.java:112)
    ... 2 more
TestNull$ExtendedException: java.lang.NullPointerException: childBean is null!!
    at TestNull.validateDeepNull(TestNull.java:127)
    at TestNull.example4(TestNull.java:83)
    at TestNull.main(TestNull.java:21)
Caused by: java.lang.NullPointerException: childBean is null!!
    at java.util.Objects.requireNonNull(Objects.java:228)
    at TestNull.validateDeepNull(TestNull.java:123)
    ... 2 more

補足

まずは動かしてみたかったので、きちんと動くかの確認は不十分です。。