重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

例外のthrowsがよくわかりません。

(例1)
public static void main(String[] args) throws Exception {
new testClass().testA();
}
void testA() throws Exception {
FileReader exFile = new FileReader("exFile.txt");
}

(例2)
public static void main(String[] args) throws FileNotFoundException {
new testClass().testA();
}
void testA() throws FileNotFoundException {
FileReader exFile = new FileReader("exFile.txt");
}


上記2つの例ではどちらも
「java.io.FileNotFoundException: exFile.txt (指定されたファイルが見つかりません。)」
というログが出力されるようです。
throws ExceptionにしてもFileNotFoundExceptionと判別できるのならば、
あえてthrows FileNotFoundExceptionにする必要がなく、大抵の場合
throws Exceptionにしておけばよいと思うのですが、
その解釈は間違っているでしょうか?

A 回答 (3件)

このサンプルでは、ただ例外をthrowするだけだから、意味がわかりづらいのでは。

この場合のthrows Exceptionは、単に「どういう例外がここからthrowされるか」なので、違いは「Exception(すべての例外のスーパークラス、すなわちすべての例外)がthrowされる」か「FileNotFoundExceptionという例外だけがthrowされる」かの違いです。これだけだと、あんまり意味があるように見えないかも知れないですね。

では、すべてthrows Exceptionでいいじゃないか、というと、まぁそういえないこともないですが、そういう書き方は「例外処理の一番拙い処理法」といっていいでしょうね。なぜ、例外処理があるかといえば、例外というプログラム実行時に発生する問題をいかにして処理するか、その解決のためにあるわけです。例外は、「どのような問題が発生したか」を示す重要な役割を果たします。

あるメソッドが、throws FileNotFoundExceptionとして定義されていれば、そのメソッドを利用する人間は、「なるほど、このメソッドはファイルが見つからない場合に例外を返すんだな」とわかります。従って、ファイルが存在しない場合の対処法のみを用意しておけば事足ります。

では、メソッドがthrows Exceptionだった場合、そのメソッドを利用する人間は、一体どんな対処をすればいいんでしょうか? 果たしてどんな例外が起こるかもわからない。となると、具体的にどんな対策をすれば発生した例外に対し確実な対応ができるのか、これはかなり難しい問題となりますよ。結局、その処理を中断するとか、限られた対応しかできなくなりますね。

自分で全ソースコードを管理しているならば、throws Exceptionでもいいでしょうが、そのクラスが汎用性を持ち、他者から利用されるというような場合、厳密に例外を定義しておくことで、そのメソッドを利用する人間が確実に例外処理を行えるようになるわけです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/05/11 10:55

throwsはそのメソッドが何のエラーを発生させる可能性があるかを記述します。


Exceptionにしておくと実装者はとにかくエラーをハンドリングしなくてはならないですが、
FileNotFoundExceptionとなっていると、ファイルが見つからなかったときのエラーを処理しなければならないと判断できます。

どうしておくのが良いかはその実装によりますが、
広くしておくとそのメソッドを使う人に対して
詳細な判断材料を奪うこともありますので気をつけて実装してください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/05/11 10:52

javaの例外は良く分かりませんがC++と同じ意味で解釈しますと・・・



例1はエラー発生時、全ての例外をコール元に投げます。
例2はエラー発生時、FileNotFoundExceptionの例外のみコール元に投げます。(それ以外の例外はコール元に投げない)

例2の記述ですと、特定の例外発生時のみ例外を投げるようにしたい場合に使用します。
(それ以外の例外については別段無視しても良いとかって場合に利用するかと)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2008/05/11 10:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!