メソッドが IOException などをスローした場合、次のことを行うことによる悪影響はありますか。
catch (Exception ex){
}
それ以外の
catch (IOException ex){
}
私のJavaコードで?
もちろんあります/あります!
キャッチすると、すべての例外がキャッチされます ( orおよびそのサブクラスException
のインスタンスを除く)。つまり、あらゆる種類のチェックされていない例外だけでなく、スローされる可能性があることに気付いていなかった他のチェックされた例外もキャッチします。Throwable
Error
例えば:
public class Test {
private File file;
public String load() {
try {
Reader r = new FileReader(file, "UTF-9");
// read file
return // file contents
} catch (Exception ex) {
return "cannot open file";
}
}
}
ここで、 のキャッチはException
、コード内の 2 つの (!) バグを隠しています。
わかりました、ありがとう。その場合、すべての例外を個別にキャッチするだけだと思います。
別の選択肢があります。Java 7 では、次のように複数の例外をキャッチできます。
catch (IOException | IllegalArgumentException ex) {
// handle both types of exception ...
}
簡単な答え
2 番目のブロックに含まれるものはすべて、最初のブロックに含まれます。ただし、2 番目には含まれない最初のものには大量の要素があります。要するに、意図していなかった多くの例外をキャッチします。はい、それは悪い考えです
間違った問題に間違った修正が適用された
私は、catch ブロック内に修正またはクリーンアップする何らかのコードがあると想定しています。IOException
または、少なくともエンドユーザーに何が起こったのかを伝え (彼は願っています)、このコードを実行します。 for anyException
は予期しない結果を引き起こす可能性があります。さらに、発生していることに気付かなかった例外を隠すこともできます。
デバッグの問題
後で、null ポインター例外または範囲外の配列を引き起こすコードを変更したとします。それでも、IO の問題が発生したかのように動作し続けます。NullPointerException がスローされたばかりの場合よりも、デバッグがはるかに困難になります。
すでに述べましたが、繰り返します。その空の catch ブロックは、この例のためのものですよね?
IOException は Exception から継承されるため、次のようにします。
catch (IOException ex)
IOException のみをキャッチしています。
しかし、あなたがするとき:
catch (Exception ex)
IOException を含むすべての例外をキャッチしています。したがって、どの例外が発生したかはわかりません。これは、IOException 以外の何かが原因で発生したときに呼び出される可能性があります。すべての例外を同じように扱いたい場合は、catch (Exception ex) を使用できますが、例外の種類ごとに異なるアクションを実行したい場合は、catch (IOException ex) を使用する必要があります。