uni-catch 句では、例外オブジェクトを自由に再割り当てできます。たとえば、これは正常に機能します。
try {
... // code that can throw IOException or some user-defined ParserException
} catch(IOException) {
e = new IOException(); // this is acceptable (although there is no point in doing it)
e.printStackTrace();
}
コンパイラは、スローされたオブジェクトのタイプが であることを確実に認識していますIOException
。ただし、マルチキャッチ句では、次のようなものを使用できます。
try {
... // code that can throw IOException or some user-defined ParserException
} catch(IOException | ParserException e) {
e = new IOException(); // this is NOT acceptable -- e may reference a ParserException
e.printStackTrace();
}
この場合、コンパイラはコンパイル時に例外の型を認識できないため、 anまたはのいずれかIOException
を参照できる変数に new を割り当てることは許可されません。それに加えて、そもそも例外変数に代入するためのユースケースが不足しています。したがって、変数を暗黙的に作成し、この混乱をすべて回避することは完全に理にかなっています。変数に割り当てる必要がある場合は、ブロックのシーケンスを記述する古い方法に切り替えることができます。IOException
ParseException
final
catch