我有一种方法(不幸的是)接受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
没有工作......提前感谢!
答案 0 :(得分:2)
查看documentation of isAssignableFrom:
确定此Class对象所表示的类或接口 与...相同或者是超类或超级接口 由指定的Class参数表示的类或接口。
所以你实际上是在检查toHandle
的类是否是Throwable的超类。这不是你想要的。
你应该反过来做这件事:
if (Throwable.class.isAssignableFrom(toHandle.getClass()))
或只使用instanceof
。
答案 1 :(得分:1)
它的另一种方式。这是isAssignableFrom(...)
方法
确定此Class对象表示的类或接口是否为 要么是类,要么是类的超类或超级接口 由指定的Class参数表示的接口。 如果是这样,它返回true;否则返回false。
所以当你这样做时
if (toHandle.getClass().isAssignableFrom(Throwable.class))
它实际上检查RuntimeException
类对象是否与Throwable
所代表的类或接口相同,或者是它们的超类或超接口。
答案 2 :(得分:0)
isAssignableFrom
检查this
类是否与参数类相同或是父类。
在您的代码中,您要问的是toHandle
是否与Throwable
的父级相同,可能不是您想要的。