• ベストアンサー

try catch 文について

jcpadでプログラムを組んでいます。  コンパイル実行すると 「例外 java.io.IOException は報告されません。スローするにはキャッチまたは、スロー宣言をしなければなりません。」 というエラーがでるのですが、BufferedReaderやDataInputStreamでは 例外処理(try~catch)は必ず書かないといけないんですか?

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

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

  • ベストアンサー
回答No.2

参考URLにBufferedReaderとDataInputStreamの詳しい説明があります。まず、あなたが使っているメソッドを見てみましょう。どれを使っているかはわかりませんが「throws IOException」ということが書かれているはずです。IOExceptionは実行時例外ではないので、IOExceptionを処理するにはtry-catchするか、またはあなたが書いているメソッドにthrows IOExceptionと書かなければいけません。 また、BufferedReaderやDataInputStreamには「throws IOException」ということが書かれていないmarkSupported()というメソッドがあります。このメソッドを使う際にはtry-catchもthrows IOExceptionもする必要がありません。つまり、「BufferedReaderやDataInputStreamでは 例外処理(try~catch)は必ず書かないといけないんですか」という問の答えは「使うメソッドによる」ということが答えになります。

参考URL:
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html
gb-club
質問者

お礼

詳しく、わかりやすい説明ありがとうございます。 参考URLこれから利用したいと思います。

その他の回答 (1)

回答No.1

スローするにはキャッチまたは、スロー宣言をしなければなりません。 とありますので、 (1)try~catchを書く か (2)public void hoge()throws IOExceptionとスロー宣言を書く のどちらかです。 記述するプログラムの仕様にもよりますが、 IOExceptionが発生した場合の処理を、発生箇所で対処するなら(1)、 IOExceptionが発生した場合の処理を、呼び出し元に任せるなら(2)、 です。

gb-club
質問者

お礼

迅速な回答ありがとうございます。 大変参考になりました。

関連するQ&A

  • try catchについて

    try catchの動きで質問があります。 以下が簡略化したソースです。 -------ここから--------------------- ストリーム1; ストリーム2; try{ try{ //ストリーム1を使った処理 }catch(IOException e){ throw e; }finally{ //ストリーム1のクローズ } try{ //ストリーム2を使った処理 }finally{ //ストリーム2のクローズ } } catch(IOException e){ throw new hogeException(); } ------ここまで-------------------------- 内側でスローされた例外は、外側でcatchされるのですか? また、内側でcatchをしなかった場合、外側でcatchされるのですか? この2点を教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 「例外 *** は対応する try 文の本体ではスローされません。」について。

    以下のソースをコンパイルすると, simulator/showManualPage.java:21: 例外 java.net.URISyntaxException は対応する try 文の本体ではスローされません。 } catch (URISyntaxException ex) { ^ simulator/showManualPage.java:23: 例外 java.io.IOException は対応する try 文の本体ではスローされません。 } catch (IOException ex) { ^ とエラーを返されます。 調べたところ、スローされるはずのない例外をキャッチしようとしている、というエラーだとは分かりましたが、スローは書いているので原因が分かりません。 やり方が悪いのでしょうか? package simulator; import java.awt.event.*; import java.awt.Desktop; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class showManualPage implements ActionListener { public void showManualPage() throws URISyntaxException, IOException { // Get Desktop Object Desktop desktop = Desktop.getDesktop(); desktop.browse(new URI("http://google.co.jp")); } public void actionPerformed(ActionEvent event) { try { // Run browser new showManualPage(); } catch (URISyntaxException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • 2つの“try ~ catch”

    こんにちは。 Javaの簡単なネットゲームのサンプルで勉強しています。 ゲームに使う変数[プレイヤー名、プレイヤー座標X,Y プレイヤー残体力]は、プレイヤーごとにハッシュテーブルに格納されることがわかりました。 JavaのハッシュテーブルのデータをJSObjectを使ってJavaScriptに渡したいのですが、ハッシュテーブルも、 JSObjectも try~catch を使っています。 ハッシュテーブルのtry~catch内でなければゲームに使う変数は取得できないと思うのですが、try~catch にJSObjectのtry~catchを入れ子にするようなプログラムの組み方がわかりません。 このような場合どのように組むのでしょうか? ご教授ください。

  • Javaの例外(tryとcatch)について

    Java初心者の大学生です。授業で、 「以下のプログラミングに書き足しをして、例外が3度繰り返されたら プログラムを終了するようにせよ。」 という課題が出ました。 以下のプログラムは… package kadai; import java.io.*; public class kadai { public static void main(String[] args)throws IOException { String ss; int idt,i; BufferedReader kbd = new BufferedReader(new InputStreamReader(System.in)); for(;;){ System.out.print("整数入力: " ); ss= kbd.readLine(); try{ idt= Integer.parseInt(ss);        System.out.println("数値= " + idt); } catch(NumberFormatException e){    System.out.println("入力誤りです" ); continue; } break; } } } というものです。(見づらくて申し訳ありません!) 私はcatchの部分をfor文で3度繰り返しさせて、終了できるようにしようと思い、変数iを定義して、 for(i=0;i<3;i++){ catch(NumberFormatException e){ System.out.println("入力誤りです" ); } } という文を打ち込みました。しかし、エラーばかり出てきてしまい、 一向に解決できません。どこにどうやってfor文を打ち込めば解決 できるでしょうか?また、何故私が考えた文ではエラーが出てしまう のでしょうか? 基礎的な質問で申し訳ありませんが、ご指導をお願い致します。 もし参考になりそうなHP等がありましたら、そちらも教えて いただきたいです。

    • ベストアンサー
    • Java
  • 例外処理throws

    例外処理ではthrowsかtry~catchを使いますよね。 で、ほとんどの場合はtry~catchを使うようで、ほとんどthrowsを使った例しかなく(まあ、throwsでの例外処理はプログラムが停止してしまうので推奨できないでしょうが)よくわから中区なってしまったので教えてほしいです class Input{ int set(String Toi)throws IOException{ System.out.println(Toi); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int a = Integer.parseInt(str); return a; } } のようにInputクラスを用いて外部からこれを使うために Input input = new Input(); x1 = input.set("x座標を入力"); とすると、「キャッチかスロー宣言をしろ」と怒られてしまいました。(コンパイルエラー) この場合どうすればいいでしょうか?

    • ベストアンサー
    • Java
  • ユーザ入力メソッドを別のクラスで呼ぶとIOExceptionのコンパイルエラーが

    お世話になります。Java勉強中の初心者です。ユーザ入力メソッドを別のクラスで呼ぶと、IOExceptionのコンパイルエラーが返ってきます。 [報告されていない例外"java.io.IOException": "usrIn.printWK5UserInputMthd();"にスローするためのキャッチか宣言の処理が必要です] みたいなメッセージが返ってきます。 自分の勉強のために、ズバリのコードより、ヒントになる分野かキーワードのアドバイスを頂けると有り難いです。 宜しくご教示ください。 m(_ _)m れざ /***ユティリティ クラス -> 入力メッソドはここに***/ import java.io.*; public class WK5UserInput { public void printWK5UserInputMthd()throws IOException { BufferedReader usrIn = new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("User input. To finish, hit Enter."); String str = usrIn.readLine(); System.out.println("Result: "+str + "\n "); } catch (IOException e){ System.out.println(e); } } } /***ドライバ クラス -> コンストラクタはここ***/ import java.io.*; class WK5inheritanceDrv{ public static void main (String[] args){ WK5UserInput usrIn = new WK5UserInput (); usrIn.printWK5UserInputMthd(); } }

    • ベストアンサー
    • Java
  • Java初心者です。例外のキャッチについて

    ■行いたこと log4jを使用してログ出力した際に、ファイルIOなどの例外が発生した場合を想定しその際に発生した例外(IOException)をキャッチして、ログ出力時にファイルIOに失敗したことを通知できるようにしたい。 ■問題 IOExceptionが発生しているようですが(下記メッセージ参照)なぜか自分のところ(プログラム)でキャッチできない。 クラスBBB メソッドbbb try { AAAクラス.メソッドaaa   ←AAAクラスのログ出力                メソッドを実行 }catch ( IOException e ) { ログ出力に失敗       ←なぜかIOExceptionを                キャッチしない。。。 } クラスAAA log = Loggerクラスのインスタンス purblic メソッドaaa throws IOException log.info("メッセージ") ←log4jのメソッドを実行 ************************************************** log4j:ERROR Failed to flush writer, java.io.IOException: 予期しないネットワークエラーが発生しました。  at java.io.FileOutputStream.writebytes(Native Method)  at java.io.FileOutputStream.write(Unknown Sorce)  at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(Unknown Sorce) 中略  at org.apache.log4j.Category.forcedLog(Category.java:372)  at org.apache.log4j.Category.info(Category.java:372)  at AAA.aaa()  at BBB.bbb() ■環境は以下のとおりです。  OS:WindowsXP  開発環境:Eclipse3.0  JAVA:J2SDK 1.4.2_06 ■疑問 なぜキャッチしてくれないか? どう対処してよいか分かりません。 どなたか教えてください。

  • throw文について

    上と下のソースプログラムがよく似ているのにもかかわらず上記のプログラムでコンパイルエラー発生する理由がわかりません。 解決方法はpublic static void badMethod()throws IOException{に書き換えるということが分かっていますがイマイチ理屈が分からない次第であります。 たぶん、上記のプログラムはimport文があるからだと思うのですが回答のほどよろしくお願い致します。 (コンパイルエラー) import java.io.IOException; class TryCatch{ public static void main(String args[]){ try{ badMethod(); System.out.println("A"); } catch(IOException ex){ System.out.println("B"); } catch(Exception e){ System.out.println("C"); } System.out.println("E"); } public static void badMethod(){ throw new IOException(); } } (コンパイル正常) public class X{ public static void main(String args[]){ try{ badMethod(); System.out.println("A"); } catch(Exception ex){ System.out.println("B"); } finally{ System.out.println("C"); } System.out.println("D"); } public static void badMethod(){ throw new RuntimeException(); } }

  • try~catch

    php初心者です try~catchをわかりやすく教えてください throw new Exceptionが出現したら、catchまでの処理をしないでとばすとゆうことですか? try~catchを抜けたら、他の処理は普通に実行されるのでしょうか? try~catchのカッコ{で囲む範囲は大きくしたほうがいいでしょうか?(大きく囲むと処理スピードおそくなりますか?) try { throw new Exception('エラーが発生しました');  print "hoge"; } catch (Exception $e) {  echo '例外発生', $e->getMessage(), "\n"; }  print "foo"; よろしくお願いします

    • ベストアンサー
    • PHP
  • try~catchの使用方法

    プログラミング超初心者です。 現在、C++やjavaの勉強をしているのですが、 ・try~catchとはなんぞや ・どんな処理をするときにtry~catchをつけなければいけないのか がよくわかっていないので、教えていただけないでしょうか? また、そういったことが載っているサイトも併せて教えていただければうれしいです。

専門家に質問してみよう