読者です 読者をやめる 読者になる 読者になる

JavaのNoSuchAlgorithmExceptionについて

計算機 Java

Java標準ライブラリにNoSuchAlgorithmExceptionという例外がある。

NoSuchAlgorithmException (Java Platform SE 8 )

java.security.MessageDigestをnewするときに、以下のように存在しないアルゴリズムの名前を与えた場合に投げられる。

MessageDigest md = new MessageDigest("MI6");

この例外が投げられる場合は、文字列を書き間違えたとき以外あるのだろうか?アメリカ合衆国からの暗号の輸出規制が絡んでいて、アルゴリズムが使えないなんて環境があるのだろうか?まず見当たらないと思う。

何が嫌なのかというと、NoSuchAlgorithmExceptionはチェック例外であることだ。

Javaの標準ライブラリは非チェック例外を投げないという方針になっている。それ自体は問題ない。非チェック例外を勝手に投げられて、ライブラリの中のようなコントロールできないところで落ちても困る。

NoSuchAlgorithmExceptionに関しては、これが出ること自体バグか環境不備とみなしていいと思う。問題なのはチェック例外だから、catchthrowしないとコンパイルエラーとなる。バグを処理するためのコードを書くのはコードが汚くなるから嫌だ。

悪い対処は以下のようにthrowすることだ。

MessageDigest createMD5() throws NoSuchAlgorithmExcepiton {
    return new MessageDirest("MI6");
}

メソッドのバグのチェックを呼び出し元に押し付けるべきではない。

私はバグっていたら、はっきり検出できるようにバッサリ止めてしまうべきという考えだ。*1以下のように非チェック例外で包むべきだと思う。

MessageDigest createMD5() {
    try {
        return new MessageDirest("MI6");
    } catch (NoSuchAlgorithmExcepiton e) {
        throw new UnsupportedOperationException(e);
    }
}

非チェック例外を何にするかは難しい。UnsupportedOperationExceptionIllegalArgumentExceptionも呼び出した方が悪いというニュアンスだが、調度良いのがない。

throw new Error(e);

でもいいが、Errorはやり過ぎな感じもする。

デザインパターンと契約

デザインパターンと契約

  • 作者: ジャン=マルクジェゼケル,クリスティンミンギンズ,ミシェルトラン,Jean‐Marc J´ez´equel,Christine Mingins,Michel Train,原隆文
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2001/12
  • メディア: 単行本
  • 購入: 1人 クリック: 11回
  • この商品を含むブログを見る

*1:同様の理由で、またコメントよりも強力に書き手の期待がわかるので、assertも積極的に使ったらいいと思う。ただし、assertはインターフェイスとして明示できないので、privateメソッドに使う。publicメソッドにはIllegalArgumentExceptionを使う。