1

为什么下面的代码不起作用?而每个类都是从 Object 类扩展而来的。

try {
// simple code , throw some exception
} catch (Object e) { 
// handle the exception
}

如果异常类是从对象类继承的,那么为什么在 catch 块中不允许对象引用?

如果有人知道上述问题的答案,请告诉我。

4

4 回答 4

11

catch 子句的参数必须继承自Throwable

这个约束从一开始就被放入 Java 语言中,并且是对 JRE 编写者的承诺的一部分,他们可以利用它来帮助他们加快速度。

于 2013-06-08T17:13:02.820 回答
7

从javadocs:

Throwable类是 Java 语言中所有错误和异常的超类。只有作为此类(或其子类之一)实例的对象才会被 Java 虚拟机抛出,或者可以被 Java throw 语句抛出。同样,只有此类或其子类之一可以是 catch 子句中的参数类型。出于对异常的编译时检查的目的,Throwable 和任何不是 RuntimeException 或 Error 的子类的 Throwable 子类都被视为已检查异常。

在这里阅读更多:http: //docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html

于 2013-06-08T17:16:03.140 回答
2

如果Object在 catch 子句中接受 where ,这样的事情实际上会起作用:

try {
    if (needToThrow) { 
        List<String> messages = new ArrayList<String>();
        list.add("a nice message");
        list.add("another message");
        list.add("random message"); 
        throw messages;
    } else {
        //do other stuff here
    } 
} catch (List list) {
    System.out.println("Got a list of messages, lets handle them");
}

然而,这将是一种非常奇怪的控制执行流程的方式,一个简单的if语句就可以解决。

所以,try and catch 机制不是为了做基本的流控,而是处理意外的结果。当部分代码遇到意外结果时,它会抛出一条消息表明他无法继续,他将中止下一条语句并将执行返回到上面的范围。他基本上是说我收到一个错误并且无法继续,有人处理这种情况。对于处理这种情况的人,需要收集资源:JVM 将对整个堆栈进行快照并将其放入Throwable对象中。这就是为什么你只能捕捉到Throwable. 此外,上述示例的性能也很差,因为错误资源会在不必要的地方收集。

关于两种已知Throwable类型

程序可以从中恢复的情况被归类为Exceptions,例如尝试打开丢失的文件、连接到无法访问的位置、尝试访问错误的 URL 等等。

当程序无法恢复时,这些情况被归类为Errors内存不足或编译错误。

尽管您仍然可以编写自己的继承自 的类Throwable,但上述两种类型已经涵盖了所有可能的错误类型(可恢复或不可恢复),因此您可能不会看到任何不是来自任何错误类型的捕获。

此外,抓住 aThrowable是一种不好的做法(你能处理一些无法处理的事情Errors吗?)。当你想“在我的代码中捕捉任何东西”时,捕捉Exception

于 2013-06-08T17:59:51.147 回答
0

你似乎对编程很陌生。无论如何,Object是 java 类层次结构的根,并且从该层次结构中定义Throwable层次结构,如果存在相关问题,则其后代用于自行抛出或被抛出。

基本上你需要学习的只是错误和异常可以在catch块中使用,因为我们跟踪问题发生而不是导致问题的对象。

因此,如果你得到 ArrayOutOfBoundsException(它是从 Exception 派生的,而 Exception 是从 Throwable 派生的),这意味着一个数组对象是这个 Exception 的原因,更好的异常处理涉及到捕获特定问题。

我想我帮助了你,如果它真的有帮助,那么我的回答是可以接受的。

于 2013-06-08T17:30:40.900 回答