Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么RuntimeException不能从Throwable分配?_Java_Instanceof_Runtimeexception_Throwable - Fatal编程技术网

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的超类。。。这是无脊椎动物。