1

から拡張された BugException という名前のクラスがあり、RuntimeException BugException に Throwable を受け取るコピー コンストラクターがあるとします。

このコードはコンパイルと型チェックを行います:

Throwable e = ...;
if (e instanceof BugException) {
   throw new BugException(e);
}

その理由は次のとおりです。

Throwable e = ...;
if (e instanceof BugException) {
   throw e;
}

コンパイルされず、次のエラー メッセージが表示されます: 未処理の例外。java.lang.Throwable. ?

タイプチェッカーを満たすために、なぜこの不要なラッピングが必要なのですか?

4

1 に答える 1

5

コンパイル時には、例外の種類はわかりませんe。チェックされた例外である可能性があります。その場合、コンパイラはthrow、try/catch でラップするか、メソッドにスローさせる必要があります。

ただし、未チェックの例外を明示的にキャストすると、コンパイルされます。

Throwable e = ...;
if (e instanceof BugException) {
   throw (BugException) e;
}
于 2016-05-30T02:44:39.167 に答える