- 締切済み
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(); } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tachiwa
- ベストアンサー率34% (25/73)
class X はRuntimeExceptionを投げています。この例外は非チェック例外なので、メッソド側 [void badMethod()]でthrows RuntimeExceptionとしなくてもコンパイルされますが、class TryCatch では チェック例外のIOExceptionをthrowするためには public static void badMethod()throws IOException{ throw new IOException } とする必要があります。 全体のコーディングは下記のようにします。 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()throws IOException{ throw new IOException(); } }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
私もあまり詳しいとは言えませんが… 例外には、いわゆる キャッチ例外と非キャッチ例外があります。 IOExceptioonはキャッチ例外であり、 キャッチ例外の場合は、これをスローするメソッドは、スロー宣言をしなければなりません。 つまり public static void badMethod() throws IOException{ throw new IOException(); } と書かなければいけないと言うことです。 逆に、非キャッチ例外は、スローが直接どこかのメソッドのせいで起こるというよりシステムに起因するものなので、try文やスロー宣言を強制しません(書いても良い) 非キャッチ例外には、例えば0による割り算などの時に起こり、コンパイル時にチェックがされません。
お礼
回答ありがとうございました。 調べてみると、Exceptionクラスを継承したサブクラスは必ずthrowsのキーワードがいるようです。 BLUEPIXYさんの回答が引き金となって昔のノートを見たらその様に書いていました。 本当に感謝します。
お礼
回答ありがとうございました。 コンパイルエラーもなく動きました。