13

Java 7 に追加されたmulti-catch 機能に関する Oracle のドキュメントには、catch句の例外パラメーターが暗黙的に であると記載されていますfinal

私の質問は次のとおりです。そのような制限のポイントは何ですか? それがもたらす重要な改善が1つも見つからないように見えるからです。参照オブジェクトを としてマークすることfinalは、それが参照するオブジェクトではなく、参照自体を変更から保護するだけであり、別の参照を作成してそれを好きなように変更することを決して禁止しません。

SO に関するやや関連性のある質問では、catch句の例外参照を変更することが最も賢明なことではない理由について説明していますが、それは句のマルチキャッチ形式だけでなく、句の使用に関連しています。catchでは、なぜ Java はマルチキャッチの例外を作成し、それを特別な方法で扱うのでしょうか?

4

1 に答える 1

21

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 を割り当てることは許可されません。それに加えて、そもそも例外変数に代入するためのユースケースが不足しています。したがって、変数を暗黙的に作成し、この混乱をすべて回避することは完全に理にかなっています。変数に割り当てる必要がある場合は、ブロックのシーケンスを記述する古い方法に切り替えることができます。IOExceptionParseExceptionfinalcatch

于 2015-03-08T18:31:12.460 に答える