Java 为什么RuntimeException不能从Throwable分配?
我有一个方法(不幸地)接受Java 为什么RuntimeException不能从Throwable分配?,java,instanceof,runtimeexception,throwable,Java,Instanceof,Runtimeexception,Throwable,我有一个方法(不幸地)接受对象实例作为其唯一参数。如果对象是任何类型的可丢弃的(这意味着所有异常-已选中或未选中,以及所有错误),我需要添加不同的处理逻辑 当我这样调用此方法时: RuntimeException rte = new RuntimeExceptio("Panic!"); handle(rte); isAssignableFrom检查返回false,并且永远不会调用handleThrowable为什么? 相反,我必须使用: public void handle(Object to
对象
实例作为其唯一参数。如果对象是任何类型的可丢弃的
(这意味着所有异常
-已选中或未选中,以及所有错误
),我需要添加不同的处理逻辑
当我这样调用此方法时:
RuntimeException rte = new RuntimeExceptio("Panic!");
handle(rte);
isAssignableFrom
检查返回false,并且永远不会调用handleThrowable
为什么?
相反,我必须使用:
public void handle(Object toHandle) {
if(toHanlde instanceof Throwable)
handleThrowable(toHandle);
}
正如我所预料的那样,这是有效的。但是仍然不明白为什么isAssignableFrom
不起作用…提前谢谢 相反。下面是isAssignableFrom(…)
方法的java文档
确定此类对象表示的类或接口是否为
与类相同,或是类的超类或超接口,或
由指定的类参数表示的接口。
如果是,则返回true;否则返回false
所以当你这么做的时候
if (toHandle.getClass().isAssignableFrom(Throwable.class))
它实际上检查RuntimeException
类对象是否与Throwable
表示的类或接口相同,或者是该类或接口的超类或超接口。下面是isAssignableFrom(…)
方法的java文档
确定此类对象表示的类或接口是否为
与类相同,或是类的超类或超接口,或
由指定的类参数表示的接口。
如果是,则返回true;否则返回false
所以当你这么做的时候
if (toHandle.getClass().isAssignableFrom(Throwable.class))
它实际上是在检查RuntimeException
类对象是否与由Throwable
表示的类或接口相同,或者是该类或接口的超类或超接口查看:
确定此类对象表示的类或接口
与的超类或超接口相同,或是的超类或超接口
由指定的类参数表示的类或接口
因此,您实际上是在检查toHandle
类是否是Throwable的超类。这不是你想要的
你应该反过来做:
if (Throwable.class.isAssignableFrom(toHandle.getClass()))
或者只需使用instanceof
查看:
确定此类对象表示的类或接口
与的超类或超接口相同,或是的超类或超接口
由指定的类参数表示的类或接口
因此,您实际上是在检查toHandle
类是否是Throwable的超类。这不是你想要的
你应该反过来做:
if (Throwable.class.isAssignableFrom(toHandle.getClass()))
或者简单地使用instanceof
isAssignableFrom
检查这个类是否与参数类相同,或者是参数类的父类
在代码中,您询问toHandle
是否与Throwable
相同或是其父级,这可能不是您想要的。isAssignableFrom
检查此
类是否与参数类相同或是参数类的父级
在您的代码中,您询问toHandle
是否与Throwable
相同或是其父项,这可能不是您想要的。它正在工作。无法将超级类型指定给派生类型。您真的想知道Throwable是否可以从您的类型分配,而不是从其他类型分配。请反转isAssignableFrom
,该语句将始终为false,因为RuntimeException(和所有异常)不是同一类型,或Throwable的超类。。。这是无脊椎动物,它在工作。无法将超级类型指定给派生类型。您真的想知道Throwable是否可以从您的类型分配,而不是从其他类型分配。请反转isAssignableFrom
,该语句将始终为false,因为RuntimeException(和所有异常)不是同一类型,或Throwable的超类。。。这是无脊椎动物。