アウトしようとしているときに、マルチキャッチ私は私の中で見つかった機能m1()
すべてが期待どおりに正常に動作している方法を。
しかし、中にm2()
同じコードコンパイルされません。私はコードの行数を減らすために、構文を変更しました。
public class Main {
public int m1(boolean bool) {
try {
if (bool) {
throw new Excep1();
}
throw new Excep2();
//This m1() is compiling abs fine.
} catch (Excep1 | Excep2 e) {
return 0;
}
}
public int m2(boolean b) {
try {
throw b ? new Excep1() : new Excep2();
//This one is not compiling.
} catch (Excep1 | Excep2 e) {
return 0;
}
}
private static interface I {
}
private static class Excep1 extends Exception implements I {
}
private static class Excep2 extends Exception implements I {
}
}
なぜ、この方法ではありませんm2()
コンパイル?
式の型
b ? new Excep1() : new Excep2()
であるException
ことが共通のスーパータイプだから、Excep1
とExcep2
。
しかし、あなたがキャッチされていないException
ので、コンパイラはそれについて不平を言います。
あなたがキャッチした場合Exception
、それはコンパイルを通過します。
public int m2(boolean b) {
try {
throw b ? new Excep1() : new Excep2();
} catch (Exception e) {
return 0;
}
}
私はあなたの例では、条件三項式の型を説明JLSエントリを見つけることを試みました。
私は見つけることができるすべては、この特定の表現があるということでした15.25.3。参考条件式。
それは、ポリ式またはスタンドアロン式としてカウントしている場合は、私は完全にはよく分かりません。(ポリ式が代入コンテキストまたは呼び出しコンテキストを伴うことから、と私は考えていない私はそれのスタンドアロンと思うthrow
それらのいずれかとしてステートメントカウント)。
スタンドアロンの発現のための:「第二及び第三のオペランドが(ヌル型であってもよい)、同じタイプを持っている場合、条件式の一種です」
あなたのケースでは、第2および第3のオペランドは、3つの一般的な種類を持っている- Object
、Throwable
およびException
- throwステートメントでの発現は、いずれかの参照型の変数または値を示す必要がある」、以来、式の型は、後者の二つのいずれかでなければなりませんどのタイプのThrowableへ(5.2)割り当て可能です。」
コンパイラが最も具体的な一般的なタイプを(選ぶことが表示されますException
)ので、catch (Exception e)
コンパイル・エラーを解決します。
私はまた、の二つのサブクラスを使用して2つのカスタム例外を交換しようとしたIOException
場合は、ここで、catch (IOException e)
コンパイルエラーを解決します。