IOExceptionやFileNotFoundExceptionなど、例外をスローするメソッドとこの例外のサブクラスを宣言することは意味がありますか?
呼び出し元メソッドで両方の例外を別々に処理するために使用されていると思います。ただし、メソッドが最も一般的なIOExceptionのみをスローする場合、両方の例外を処理することは可能ですか?
IOExceptionやFileNotFoundExceptionなど、例外をスローするメソッドとこの例外のサブクラスを宣言することは意味がありますか?
呼び出し元メソッドで両方の例外を別々に処理するために使用されていると思います。ただし、メソッドが最も一般的なIOExceptionのみをスローする場合、両方の例外を処理することは可能ですか?
ただし、メソッドが最も一般的な IOException のみをスローする場合、両方の例外を処理することは可能ですか?
絶対。あなたはまだそれらを別々に捕まえることができます:
try {
methodThrowingIOException();
} catch (FileNotFoundException e) {
doSomething();
} catch (IOException e) {
doSomethingElse();
}
したがって、メソッドが両方を宣言している場合、呼び出し元ができることに違いはありません。冗長です。ただし、考慮すべき例外を強調することはできます。これは、ただの throws 宣言よりも Javadoc の方が適切に実行できます。
例外をスローするメソッドと、この例外のサブクラス (IOException や FileNotFoundException など) を宣言することは意味がありますか?
通常はそうではありません-私が知っているほとんどのIDEは、そのような宣言に対して警告を発します。あなたができること、すべきことは、Javadoc でスローされるさまざまな例外を文書化することです。
ただし、メソッドが最も一般的な IOException のみをスローする場合、両方の例外を処理することは可能ですか?
はい、catch ブロックが正しい順序になっていることを確認する必要があるだけです。Catch ブロックは定義された順序で評価されるため、ここでは
try {
...
} catch (FileNotFoundException e) {
...
} catch (IOException e) {
...
}
スローされた例外が の場合FileNotFoundException
、最初のブロックでキャッチされcatch
ます。それ以外の場合は、2 番目のブロックに分類され、一般的な として処理されIOException
ます。を含むcatch (IOException e)
すべての をキャッチするように、逆の順序は機能しません。(実際、後者はコンパイル エラー IIRC になります。)IOException
FileNotFoundException
メソッドが(より一般的な)IOException
、および(より具体的な)をスローする可能性があることを宣言することFileNotFoundException
は、通常は良いことです-後でコードを使用する人々のための追加情報です。どのような状況で各例外がスローされるかについては、JavaDocで明示的に指定する必要があることに注意してください。
それでも例外を区別し、次のようなcatch構造を使用して異なる方法で処理することができます。
try {
yourAwesomeMethod()
} catch (FileNotFoundException ex) {
// handle file-not-found error
} catch (IOException ex) {
// handle other IO errors
}
はい、メソッドが IOException のみをスローする場合は、両方を処理できます。
このような質問に答える最善の方法は、それを実証するテストを作成して試してみることです。JVMに答えを教えてもらいましょう。ここで聞くより早いです。
はい。特定の特殊な例外を正しく処理できる場合。次のように例外を処理する場合は、次のようになります。
try {
} catch (FileNotFoundException f) {
//Try a different file
} catch (IOException ioe) {
//Fatal, Maybe bad blocks ... Bail out...
} catch (Exception e) {
//Something went wrong, see what it is...
}
ただし、メソッドが最も一般的な IOException のみをスローする場合、両方の例外を処理することは可能ですか?
catch(IOException ex){
if(ex instanceof FileNotFoundException){}
}
しかし、これはきれいに見えません。両方の例外をスローすると見栄えがよくなります。呼び出し元でさえ、このメソッドがこれらの例外をスローする可能性があることを知るようになるため、適切に処理されます