• ベストアンサー

例外処理の作法

基本的なことですみません、 Try~Catch構文で例外をハンドリングする際に「RuntimeException」と 「Exception」のどちらでCatchするのが良いのでしょうか?。 雑誌のサンプルを眺めているのですが、使い分けのやり方が 良くわかりません。 すみませんがアドバイス頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#49664
noname#49664
回答No.1

>Try~Catch構文で例外をハンドリングする際に「RuntimeException」と 「Exception」のどちらでCatchするのが良いのでしょうか?。 あえていうなら、「どちらも間違いです」 どちらを使うか、ではなくて、「そのときに発生する例外に対応したcatchを用意する」のが基本です。tryを使うのは、その中で例外を発生する場合がある処理があるからですね? では、それはどのメソッドで、なんという例外が発生するのでしょうか。それを調べれば、どのようなcatchを用意すべきか、わかってきます。 例えば、Stringをintに変換するInteger.parseIntというのがありますが、これなど、 try { int n = Integer.paseInt(str); } catch (Exception e){} このように書いてある参考書などがありますが、これは「やっつけ仕事の例外処理」です。普通は、こう書きます。 try { int n = Integer.paseInt(str); } catch (NmberFormatException e){} paseIntで発生するのはNmberFormatExceptionですから、これをcatchするように書くのが基本です。このようにすることで、例えば複数の例外が発生するような場合には、どの例外でどういう対処をするか明確に記述することができ、例外発生の対応をより柔軟に行うことができるようになります。 Exceptionをcatchするというのは、そうした細やかな対応を放棄し、「例外なら全部一緒」という対処をすることになります。これは、正直、とても勧められません。何のためにtryを書き、何のためにcatchがあるか、ということをよく考えるべきだと思います。 JavaのAPIドキュメントをこまめに調べれば、どのメソッドでどういう例外を返すかわかりますから、それをcatchする習慣をつけたほうがよいでしょう。

noname#46520
質問者

お礼

有難うございました。 やはり基礎が大切ですね・・。

その他の回答 (1)

回答No.2

どちらの使い分けが良いというものはありません。 というのも、システムの仕様によって変化してきますから・・・ そして、発生しうるExceptionをcatchに記述するものですから・・・ まず、そこを念頭においてください。 本題ですが、 Sun提供のJavaDocは読まれたでしょうか? 簡単に書きますけど、 RuntimeExceptionの子クラス(子Exception)が発生する場合は、RuntimeExceptionを、 RuntimeExceptionではなくExceptionの子クラス(子Exception)が発生する場合は、 Exceptionを使用しています。 JavaDocを確認していただければ分かりますが、 直系のサブクラスというのが、子クラスにあたります。 http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/lang/Exception.html, http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/lang/RuntimeException.html

noname#46520
質問者

お礼

有難うございました。 やはり基礎が大切ですね・・。 みっちり勉強します。有難うございました。

関連するQ&A