Java初心者の例外処理についての質問

このQ&Aのポイント
  • Java初心者の方が例外処理について質問しています。
  • 質問者はforループ内でtry-catch文を使ってNullPointerExceptionを捕捉しています。
  • 質問者はforループ内で条件式を使ってNullPointerExceptionを判定する方法と、try-catch文を使う方法のどちらが良いか悩んでいます。
回答を見る
  • ベストアンサー

例外処理を条件式として使っていいのですか?

Java初心者です。 以下の様にしているのですが、 for(int i = 0; i < 10; i++){ try { NullPointerException 例外が出る処理 } catch (NullPointerException e) { break; //e.printStackTrace();//例外をコンソールに表示させない。 } } は、以下のようなforを使うのとどのはどちらがいいのでしょうか。 条件式がたくさん必要な場合があり、catch したほうが楽なような気がします。 for(int i = 0; i < 10; i++){ if(例外が出る処理==null){ break; } } また、安全性はどうなのでしょうか。 根本で間違っているのではないかと思い不安で質問しております。 お詳しい方がおられましたら教えて下さいませんでしょうか。 よろしくお願い致します。

  • Java
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.1

例外を通常の制御フローに利用することは、各所でバッドプラクティス(良くない慣習)とされていますね。 この例の場合だと、異常が無くてもnullになる値にアクセスして例外が発生しているのであれば、そうなりますね。 Effective Javaでは「例外的状況にだけ例外を使用する」と表現されています。 理由としては、もともと例外はエラー等の例外的状況で使用されることを前提としているため、JVMによる最適化がされにくいこと、コードの読み手も何らかの異常が発生したという前提で読むことが多いこと、メソッドを超えたジャンプを引き起こすためコードが複雑になることなどが挙げられます。また、異常によって発生した同種の例外を区別するすべは有りませんから、異常が発生してもそれが隠されてしまう可能性も有ります。 下記の書籍・サイトは参考になるでしょう。 http://www.amazon.co.jp/dp/489471499X http://www.amazon.co.jp/dp/489100455X/ http://www.ibm.com/developerworks/jp/java/library/j-jtp05254/#1.0 なお、nullチェックについては、Nullオブジェクトパターンなどを使って簡略化できる場合も有りますよ。 http://www.hyuki.com/dp/dpinfo.html#NullObject

hatokamome
質問者

お礼

説明とても解りやすくありがとうございます。 Effective Javaも読んでみようと思います。

その他の回答 (1)

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.2

上記のソースは、そこだけ見ても何の処理か解りません。 例えば異常終了したのか、処理を途中で切り上げたのか。 リストの終端に行き着いたから正常終了しただけなのか。 などです。 どちらが正しいかは、文脈(内容)次第なので、一概には言えません。

関連するQ&A

  • 例外処理

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

    • ベストアンサー
    • Java
  • close()で例外が投げられる理由

    最近、Java を勉強しはじめておるのですが、ファイル入出力処理で例えば、out.txt なるファイルを出力するサンプルとして FileWriter out = null; try {  wt = new FileWriter("out.txt");  out.write("はろー"); } catch ( IOException e ) {  e.printStackTrace(); } finally {  try {   if (out != null ) out.close();  } catch (IOException e) {   e.printStackTrace();  } } という風に、FileWriter オブジェクト out をクローズする時に IOException 例外が投げられる可能性に対処するため、try / catch でこれをつかまえるように、と聞きました。 そして驚くべきことに、close() が例外を投げた時の catch 節には特に書くべき処理はない、というのです。 そこで質問です。 1. 本当に FileWriter#close() の IOException 例外に対処するためのコードは不要なのですか?(常に握り潰しているだけ?) 2. 対処するコードが不要なら、そもそも FileWriter#close() が IOException 例外を投げる必要がないのではないですか? 長文失礼しました。

  • DBのコネクションのclose処理で例外が発生した場合

    DBのコネクションのclose処理で例外が発生した場合 DBアクセスが終わった後、finallyでResultSetやConnection、PreparedStatementのclose処理を行うと思います。 } finally { if (result != null) { try { result.close(); } catch (SQLException e) { } } if (ps != null) { try { ps.close(); } catch (SQLException e) { } } if (conn != null) { try { conn.close(); } catch (SQLException e) { } } } 上記では各close処理で例外が発生した場合、何もしていませんがこのあたりの処理は何を行うべきなのでしょうか。 例えばログ出力をして例外をそのまま上位にスローするなどでしょうか。 close処理で例外が発生するのは余程のことだと思うのですが、ログ出力以外で何かやるべき処理はありますでしょうか。

    • ベストアンサー
    • Java
  • 例外処理のことで

    class ExceptionTest{ static int array[] = {10,20,30,40,50}; void print(){ for(int i=0;i<10;i++) System.out.println(array[i]); } public static void main(String args[]){ new ExceptionTest().print(); } } /* 対処前 10 20 30 40 50 Exception in theread "main"java.ArrayIndexOutOfBoundsException:5 at ExceptionTest.print(ExceptionTest.java:6) at ExceptionTest.main(ExceptionTest.java:10) という実行結果を 対処後 10 20 30 40 50 例外 例外 例外 例外 例外 */ という出力結果を出したいのですがどうしたらいいのですか? また、 /* 10 20 30 40 50 例外が発生しました */ という出力結果も同様にお願いします。

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

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

    • ベストアンサー
    • PHP
  • 例外処理に関して

    質問なのですが、よろしくお願い致します。 ファイルに空白行があった場合、任意に例外を発生させることをしているのですが、 (例外処理内容:ファイルにログを出力する) 例外が2回キャッチされているようで、2回目にファイル(ログファイル)は既に開かれています。というエラーが出ますが、以下のソースでは、呼出元と呼び出されたメソッドともに例外を処理してしまうのでしょうか? また、どう改善したらいいでしょうか? ご教授よろしくお願い致します。 呼出元 public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Try    Dim cls As New testClass cls.timer1() Catch e as Exception 'ログファイル出力 End Try End Sub 呼び出されるメソッド Public Sub Timer1() try FileOpen(1,"ファイルパス",OpenMode.Input) if Trim(LineInput(1)) = "" Then FileClose(1) Throw New Exception End If Catch e as Exception    'ログファイル出力 End Try End Sub

  • どの例外でcatchすればいいのですか?

    例外の使い方を理解できていません。 さっき検索してみて下の質問と回答を見つけました。 例外処理がまったくわかりません!! http://www.okweb.ne.jp/kotaeru.php3?q=704380 この中の#2さんの回答、 >    catch (FileNotFoundException e){ ・・・ } >     catch (IOException e){ ・・・ } >   などと分けて書かなくとも、 >     catch (Exception e){ ・・・ } >   と書けば、すべての例外を処理できます。 を読むと「それなら、どんな例外でもすべて"(Exception e)"でcatchすればいいじゃん」と思うのですが駄目ですか? もし駄目ならどんな基準でExceptionを選んでいるのですか? 例えば、下のような二分検索木への挿入メソッドの場合、 どこでどのような例外を使ってcatchすればいいのですか? 私の思うような例外を入れてみましたが、どんなエラーが出るかも分からないし…。 だからと言ってthrow ~ catchを入れないとJBuilderが怒るんですよね…。 public void insert(int el) { IntBSTNode p = root, prev = null; try { while (p != null) { prev = p; if (p.key < el) p = p.right; else p = p.left; } if (root == null) root = new IntBSTNode(el); else if (prev.key < el) prev.right = new IntBSTNode(el); else prev.left = new IntBSTNode(el); } catch (Exception x) { System.out.println("エラーだ! 何か表示"); } } 分かる方、説明をお願いします。

    • ベストアンサー
    • Java
  • 例外処理の付け方

    javaを使って通信のプログラムを作成しています。 ホストAで送信データを作成し、そのデータをホストBに送信して、 ホストAが送信するのにかかった時間と、ホストBが受信するのにかかった時間を 計測するプログラムを作成しました。 送信と受信の処理を行うのですが、送信側では、write()でバッファに書き込んで、 fulsh()で書き込まれたバイトを出力ストリームに書き込みます。 受信側では、while((ch=in.read()) != -1)で送信データをすべて読み込ませます。 write()、fulsh()を使って送信し、read()で受信するのですが、 これらのメソッドが正常に動いたかどうかを調べたいのです。 ネットで方法を調べたのですが、try catchを使うことで例外処理が発生したら、 エラーを出力させることができることがわかりました。 もしurite(),fulsh(),read()が正常に起動しないならエラーを出したいのです。私なりに考えて以下のようにしました。 コードは以下のとおりです。送信部分、受信部分です。 送信側 int count = 0; // write()の回数 System.out.println("<データ送信処理>"); start = System.nanoTime(); // 計測開始時間 for (int i = 0; i < Data - 2; i++) {   try {     out.write(i);     count++;   } catch (IOException e) {     System.out.println(i + ":書き込みエラー");   } } try{   out.write('\\'); }catch(IOException e){   System.out.println("\\" + "書き込みエラー"); } try{   out.write('s'); }catch(IOException e){   System.out.println("s" + "書き込みエラー"); } count = count + 2; out.flush(); stop = System.nanoTime(); // 計測終了時間 System.out.println("送信完了"); 受信側 while (ch != -1) {   try{     ch = in.read();   }catch(IOException e){     System.out.println("読み込みエラー");   }   Count++;   if (ch == '\\') {     on = true;   } else if (on == true && (char) ch == 's') {     stopNs = System.nanoTime();     System.out.println("受信終了時間を確認");     break;   } else if (on == true && (char) ch != 's') {     on = false;   } } メソッドが正常に起動しない場合は、例外処理を行うということを したいのですが、上の方法は正しいのでしょうか? このようにして実行しても、「入力エラー」と言う表示はされません。 もしかしたら、ただ異常な動作が行われていないから、そういったエラーが 表示されないのかもと考えましたが、例外処理の書き方が違う可能性があると思い、 質問させていただきました。 どなたかアドバイスしていただけないでしょうか?

    • ベストアンサー
    • Java
  • try catchで例外が出ても処理を続けたい

    java初心者です。 androidアプリも初心者なのですが、 youtube検索のjsonフィードから 要素data.items.content.1 を取り出すプログラムを作りたく、以下コードを書きました。 ところが、要素data.items.content.1 は全てのアイテムに含まれるわけではないらしく、 当該要素を含まないアイテムを検査した時点で例外を吐いて ループ終了してしまいました。 無ければ""として次に行くコードはどう書けば良いのでしょうか? JsonObjectRequest = new JsonObjectRequest(Method.GET, "http://gdata.youtube.com/feeds/api/videos?v=2&alt=jsonc&q=Michael", null, new Listener<JSONObject>(){ @Override public void onResponse(JSONObject json){ try { JSONArray items = json.getJSONObject("data").getJSONArray("items"); for(int i=0; i<items.length();++i){ String ws = items.getJSONObject(i).getJSONObject("content").getString("1"); } } }catch (JSONException e){ } } }, new ErrorListener(){ @Override public void onErrorResponse(VolleyError error){ } });

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

    こんばんは。 とあるユーザー定義例外クラスがあるとします。 でこれのコンストラクタが 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確認をするしかありませんでしょうか・・。 アドバイスお願いします。