1

我有一个方法(不幸的是)接受一个Object实例作为它的唯一参数。Object如果是任何类型Throwable(这意味着所有 Exceptions- 选中或未选中,以及所有 Errors) ,我需要添加以不同方式处理它的逻辑。

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 doc

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回 true;否则返回false。

所以当你这样做时

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

它实际上检查RuntimeException类对象是否与 表示的类或接口相同,或者是其超类或超接口Throwable

于 2013-07-05T15:23:49.250 回答
0

isAssignableFrom检查this类是否与参数类相同或父类。

在您的代码中,您询问是否toHandle与 相同或父级Throwable,这可能不是您想要的。

于 2013-07-05T15:28:28.423 回答