• ベストアンサー

例外処理の作法

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

noname#46520
noname#46520
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
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

  • 例外処理

    デバッグをしてみました。 すると,try・catch文までしか実行されていないことがわかりました。 public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } 例外処理について調べてはみたものの、なぜこの部分で実行が止まってしまうのか、 解決につながるようなことが,みつかりません。 1.例外処理はどのような処理なのか 2.なぜ、try・catchで実行が終了してしまうのか 教えてください。

    • ベストアンサー
    • Java
  • RuntimeExceptionであるかの判断

    以下のようなtry-catch文(抜粋)があった場合について 質問します。 try{ String[] array = {"A","B","C"}; System.out.println(array[3]); } catch(RuntimeException e){ System.out.println("RuntimeException発生"); } 今回はtryで配列に関する記述がされていますが、 その他のトラブルを想定して記述が行われることもあると思います。 catchで例外クラスがExceptionではなく、 RuntimeExceptionである場合、 どのようなトラブルがRuntimeExceptionに当たるのか わからないでいます。 教えて頂けるでしょうか?

    • ベストアンサー
    • Java
  • Javaの例外処理の書き方について

    Javaの例外はErrorとRuntimeExceptionは書かなくてもいいが、 Exceptionはtryでcatchする必要があると聞きました。 しかし、java.langのStringを使っても例外処理は書きません。 なぜ、例外を書くやつと書かないやつがあるのですか? たとえば、java.langを使うとしたら、 ClassNotFoundException CloneNotSupportedException Exception の3つをjava.langを使うメソッドのブロックの上にtry文が必要だと思うのですが。

    • ベストアンサー
    • Java
  • 例外処理について

    こんにちは。 とあるメソッドで例えば 「void openErrorFile(){」とあるのですが、 メソッド内部で } catch (Exception e) { throw new RuntimeException();} と例外をThrowしています。 この場合、メソッドの定義「openErrorFile()」にはThrows句を 付ける必要は無いのでしょうか?。 すみませんがご教授願います。

    • ベストアンサー
    • Java
  • 例外処理がまったくわかりません!!

    下のプログラミングについていくつか質問があります。 (1)etest()メソッドってなんですか? (2)存在しないファイルを開くってどういうことですか? (3)FileReader( )対応catch節、Close( )対応catch節ってなんですか? (4)あと、プログラミングあとの本の解説の部分がよくわかりません。抜粋してみます。 「一般的な例外クラスはxxxExceptionというクラス名をしています。このタイプの例外クラスはみな「Exception例外クラス」をスーパークラスにしています。この場合、「catch(Exception e)」を使うとすべてのxxxException例外を補足できるという仕様になっています。ですから下のetest( )メソッドは次のように、ひとつのcatch節で記述することができます。このようにしても表示される4エラーメッセージ(eで指示)は、正しく発生例外(FileNotFoundExceptionまたはIOException) 対応のものになります。」 public static void etest( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } よろしくお願いします。

    • ベストアンサー
    • Java
  • C++の例外処理

    お世話になります。 現在C++でプログラミングを行っていますが、例外処理で困っています。 次のようなコードを書きました。 try{   m_Session.DestroyDatabasePool();   }catch(CException e){   m_Share.WriteLogFile("キャッチ中", LOG_INFO ); } しかし、これだとcatchが行われず、catch(CException e)部分を(...)にすると例外処理が実行されます。 例外の詳細を知りたいので、どうしても(CException e)で行いたいです。 説明が不十分かもしれませんが、何かご存知でしたら、ご教授お願いします。

  • PHPの例外処理

    PHPの例外処理について教えてください function test() {   try{    $a = 10;    $b = 0;    $result = $a/$b;   }   catch(Exception $e){    //エラー処理   } } 上記でcatchが実行されるためにはどのようにすれば良いでしょうか?例えば if($b == 0) {   throw new Exception('例外'); } を「$result = $a/$b;」の前に書いておくなどすればcatchされるのはわかりますが、 想定されるすべての例外のthrow処理を記載するなんてことはしたくありません。 実行してエラーだったら自動的にthrowされる、なんていうことはPHPでは無理でしょうか?

    • ベストアンサー
    • PHP
  • 例外処理についてご相談

    こんばんは。 とあるユーザー定義例外クラスがあるとします。 でこれのコンストラクタが sendException (String errId) sendException (String errId,String errMsg) sendException (String errId,String errMsg,Throwable e) と3種類あるとします。 でCatchする方の記述で困っています。 実は上記例外の送出は既存システムで、3種類全て使用されているのです。 つまり最初の xxxException (String errId) が送出されてきて、Catch側で「Throwable e」を取り出そうとしたら 「NullPointerException」が発生するような気がします。 Catch側でどのコンストラクタでExceptionが生成されたか、チェック する方法はありますでしょうか?。 CatchしたExceptionのプロパティのNull確認をするしかありませんでしょうか・・。 アドバイスお願いします。

  • 例外処理と、ハンドルする範囲

    Try Catchや、throws Exceptionを使うべき時についてです。 ・0除算がありうるとき ・DLLや外部EXEを使用するとき、そっちの世界でのエラーをハンドルするとき ・ネットワークエラーや、DBサーバでのエラーをハンドルするとき ・ディレクトリがないとき・ファイルがないとき ・リフレクション?で、型判定・キャストを使用するときに、意図しない型のクラスが渡されてきた場合 などは、ハンドリングしつつ、それ用のエラーページにてエラーを表示しようと思いますが、 (1)みなさんはどのようなものまでハンドリングしていますか? 自分は、 Catch ex As System.xxx.xxxxxxException を何種類も書くメリットが感じられないので、 catch (System.Exception ex) で、上のもの以外のエラーについて、ex.Messageを出力しています。 (2)例外があったとき、エラーページに飛ばさずに、呼び元に扱いを任せる場合は(throwsさせる場合)どう使い分けをしていますか? (3)呼び出された側のクラスの、catch (Exception e)のブロックの中で、エラーページに飛ばしていますか?それとも、一番最初の呼び出し元まで、throws→throws→throws...して、一番最初の呼び出し元からエラーページに飛ばしていますか? .

  • phpの例外処理がエラーをトラップしてくれない。

    以下のように例外処理を記述しした場合、 try{ //ここでエラー } catch (Exception $e){ $ErrorMsg="その他エラー:".$e->getMessage(); } tryの中で、0除算によるエラーが発生してもエラーをトラップして、例外 処理のcatchに飛びません。 どのように記述すればエラーをトラップできるのでしょか?

    • ベストアンサー
    • PHP

専門家に質問してみよう