为什么不能从Throwable分配RuntimeException?

时间:2013-07-05 15:19:53

标签: java instanceof runtimeexception throwable

我有一种方法(不幸的是)接受Object实例作为其唯一参数。如果Object是任何类型的Throwable(意味着所有 Exceptions - 已选中或未选中,以及<我需要添加以不同方式处理它的逻辑strong>所有 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没有工作......提前感谢!

3 个答案:

答案 0 :(得分:2)

查看documentation of isAssignableFrom

  

确定此Class对象所表示的类或接口   与...相同或者是超类或超级接口   由指定的Class参数表示的类或接口。

所以你实际上是在检查toHandle的类是否是Throwable的超类。这不是你想要的。

你应该反过来做这件事:

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

或只使用instanceof

答案 1 :(得分:1)

它的另一种方式。这是isAssignableFrom(...)方法

的java文档
  

确定此Class对象表示的类或接口是否为   要么是类,要么是类的超类或超级接口   由指定的Class参数表示的接口。   如果是这样,它返回true;否则返回false。

所以当你这样做时

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

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

答案 2 :(得分:0)

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

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