質問: ### 背景 「Effective Java」という本で、例外について勉強しています。 Effective Javaには、以下のように書かれていました。 > > > 回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する > > > ### 質問 `java.text.DateFormat#parse`は実行時例外の`ParseException`をスローします。 > > > ParseException - 指定された文字列の先頭が解析できない場合。 > > > Effective Javaの説明によれば、実行時例外をスローすべきだと思うのですが、なぜ検査例外をスローしているのでしょうか? 「文字列の解析ができない場合」は、呼び出し側が不正な引数を渡したとき、すわなちプログラミングエラーに該当すると思います。 また、`Integer.parseInt`は、Effective Javaの説明通り、実行時例外`NumberFormatException`をスローしています。 `Integer`のパースと`Date`のパースは何が違うのでしょうか?
回答: 一般的に考えて、ご指摘の通りこれは実行時例外であるべきです。 ところが呼び出し側が正しい書式を渡しても解析に失敗する可能性というのがあります。実はこのインターフェースはスレッドセーフであることを保証しておらず、実際にSimpleDateFormatはスレッドセーフでありません。他スレッドの介入により失敗する可能性があり、その意味で検査例外であることも間違いではないのです... そして結論としてこんな単なる文字列解析でスレッド競合引き起こすようなクソクラスを使ってはいけないとなります。FastDateFormat使いましょう。