nullだったら例外を投げるちょっとだけ便利なメソッド
ひさびさにJavaでコードを書いてます。
で、コードを動かしてて実行時例外が投げられると悲しいですが、特にVMが投げるNullPointerException (NPE) はスタックトレースだけじゃ原因がよくわかんないことがあります。
<T> Class<? extends T> getClass(Class<T> type, String name) throws ... { // ここでNPEが投げられると、typeとnameのどっちが原因なのかがわからん。 return Class.forName(name).asSubclass(type); }
なのでVMに任せないで自分で調べるようにしてますが、これがまためんどくさい。
<T> Class<? extends T> getClass(Class<T> type, String name) throws ... { // nullだったら例外の詳細メッセージに変数名を入れておく。 if(type == null) { throw new NullPointerException("type"); } // でも何度も同じことを書くのはめんどくさい。 if(name == null) { throw new NullPointerException("name"); } return Class.forName(name).asSubclass(type); }
ということで、nullだったら例外を投げる処理をメソッドにしてみました。
あ、J2SE 5.0以降、ってことで。
/** * <p>{@code null}ではないかを調べます。</p> * * @param name * 名前。例外を投げる場合、その詳細メッセージとなる * @param value * {@code null}ではないかを調べる値 * @return * 引数<code><var>value</var></code> ({@code != null}) * @throws NullPointerException * 引数<code><var>value</var></code>に{@code null}を指定した場合 * * @since J2SE 5.0 */ public static <T> T notNull(String name, T value) { if(value != null) { return value; } // value == null だったら NullPointerException を投げる。 // APIの仕様によって IllegalArgumentException とかに変える。 // 場合によっては assert ってのもありかも。 throw new NullPointerException(name); }
共通で使うクラスのメソッドにしとけば、staticインポートして使えます。
どうやって使うかというと、こんな感じ。
<T> Class<? extends T> getClass(Class<T> type, String name) throws ... { return Class.forName(notNull("name", name)).asSubclass(notNull("type", type)); }
notNull()
の返値をキャストしなくていいし、意外と便利だったのでメモしときます。
っていうか、こんなことしなきゃならんJavaってめんどうだ。
(おとなしくデバッガ使え、ってのは聞こえないことにしとこう。)
(追記: null
じゃないことを示す@NotNull
みたいなアノテーションもできそうな気がするが、もしそうならJ2SE 5.0のAPIにないのが解せない。)