1

我是 JAVA 新手,我正在准备我的 OCP JP 认证。

我对异常处理有这个疑问

try{
        assert(false):"HI";
    }
catch(Throwable e){}

我知道不应该处理断言,但我只是在使用它。据我所知 Object->Throwable ->Exception and Error

如果我在 catch 块中有 Throwable 或 Exception 或 Error 它可以工作,但是当我有一个超类的对象时,eclipse 会显示一个编译时错误。

为什么我不能在 catch 块中有对象?

4

6 回答 6

5

在 Java 中,只能抛出或捕获类型的对象Throwable(包括Exception和)。Error

throw new Object(); // compiler error
throw new Integer(1); // compiler error

所以抓住任何 old 都是毫无价值的Object,因为只能Throwable抛出 s 。

引用JLS,第 14.20 节

用于表示异常参数类型的每个类类型必须是 Throwable 类或 Throwable 的子类,否则会发生编译时错误。

于 2013-08-29T19:31:36.837 回答
1

根据java文档

Throwable 类是 Java 语言中所有错误和异常的超类。
只有作为此类(或其子类之一)实例的对象才会被 Java 虚拟机抛出,或者可以被 Java throw 语句抛出。
同样,只有此类或其子类之一可以是 catch 子句中的参数类型

Object是超类 Throwable,不是子类。
观察这个类层次结构。

在此处输入图像描述

于 2013-08-29T19:40:31.000 回答
0

您只能使用 Throwable 或其所有子类

于 2013-08-29T19:33:39.957 回答
0

根据JLS 14.20。尝试语句

用于表示异常参数类型的每个类类型必须是 Throwable 类或 Throwable 的子类,否则会发生编译时错误。

于 2013-08-29T19:35:45.513 回答
0

因为在 catch 中它期望 throwable。异常类或错误类是 Throwable 类型,因为它们是 Throwable 的子类。但是 Object 类不是 Throwable 接口的子类。

重要的是你不能扔东西。您可以抛出错误或异常。

于 2013-08-29T19:38:31.423 回答
0

每个人都说只有 throwable 及其子类进入 catch 块括号,这是正确的。现在,您的疑问是:-为什么对象不能存在,为什么要这样设计?我将您的问题分为两部分:- 1)为什么要这样设计?答案:-因为,我们只能抛出 throwable 类及其子类。因此,它被设计为只捕获这些类型的对象。2)为什么我们不能在 throwable 或 Exception 或 Error 的地方使用 Object 类引用?

答:- 很简单的兄弟。throwable 类是 Object 类 .ok 的子类。现在,我们知道 Parent 类可以保存其子类的引用,但子类不能保存其 Parent 类的引用。Object 类是父类,throwable 是子类,Catch 块只接受 throwable 类型。因此,您可以在 catch 块中编写 throwable 或 Exception 或 Error ,因为 throwable 类能够保存自己及其子类的引用。但是 throwable 类不能持有它自己的 Parent 类即 Object 类的引用。子类不能持有父类的引用。我认为这是我们不能在 catch 块中编写 Object 类型引用的原因。

于 2017-11-15T09:22:08.523 回答