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
補足
まずは動かしてみたかったので、きちんと動くかの確認は不十分です。。