1

(残念ながら)Objectインスタンスを唯一のパラメーターとして受け入れるメソッドがあります。ObjectがいずれかのタイプThrowable(つまり、すべて Exceptionsのチェックまたはチェック解除、およびすべて Errorの s)である場合、それを異なる方法で処理するロジックを追加する必要があります。

public void handle(Object toHandle) {
    if(toHandle.getClass().isAssignableFrom(Throwable.class))
        handleThrowable(toHandle);
}

このメソッドを次のように呼び出すと:

RuntimeException rte = new RuntimeExceptio("Panic!");
handle(rte);

isAssignableFromチェックは false を返し、呼び出さhandleThrowableれることはありません。なんで?

代わりに、次を使用する必要があります。

public void handle(Object toHandle) {
    if(toHanlde instanceof Throwable)
        handleThrowable(toHandle);
}

私が期待したように、これは機能します。しかし、なぜ機能しないのかについてはまだ困惑してisAssignableFromいます...事前に感謝します!

4

3 に答える 3

3

isAssignableFromのドキュメントを見てください:

この Class オブジェクトによって表されるクラスまたはインターフェースが、指定された Class パラメーターによって表されるクラスまたはインターフェースと同じであるか、そのスーパークラスまたはスーパーインターフェースであるかを判断します。

したがってtoHandle、クラスがThrowableのスーパークラスであるかどうかを実際に確認しています。これはあなたが望むものではありません。

逆の方法で行う必要があります。

if (Throwable.class.isAssignableFrom(toHandle.getClass()))

または単に使用しますinstanceof

于 2013-07-05T15:24:02.487 に答える
1

その逆です。isAssignableFrom(...)これがメソッドのJavaドキュメントです

この Class オブジェクトによって表されるクラスまたはインターフェースが、指定された Class パラメーターによって表されるクラスまたはインターフェースと同じであるか、そのスーパークラスまたはスーパーインターフェースであるかを判断します。その場合は true を返します。それ以外の場合は false を返します。

だからあなたがするとき

if (toHandle.getClass().isAssignableFrom(Throwable.class))

RuntimeExceptionクラス object が で表されるクラスまたはインターフェースと同じか、そのスーパークラスまたはスーパーインターフェースであるかを実際にチェックしThrowableます。

于 2013-07-05T15:23:49.250 に答える
0

isAssignableFromthisclass が引数クラスと同じか、その親かどうかをチェックします。

あなたのコードでtoHandleは、 が と同じか親であるかを尋ねていますがThrowable、これはおそらくあなたが望むものではありません。

于 2013-07-05T15:28:28.423 に答える