为什么catch块中不允许对象引用?

时间:2013-06-08 17:12:15

标签: java

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

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

如果Exception类是从对象类继承而不是为什么在catch块中不允许Object引用?

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

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:7)

来自javadocs:

  

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

在此处阅读更多内容:http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html

答案 2 :(得分:2)

如果Object接受catch子句,那么这样的东西实际上会起作用:

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和catch机制不是用于执行基本流控制,而是处理意外结果。当代码的一部分遇到意外结果时,抛出一条消息,指示他无法继续,他将中止下一个语句并将执行返回到上面的范围。他基本上说我收到错误但无法继续,有人处理这种情况。对于处理这种情况的人来说,需要收集资源:JVM将创建整个堆栈的快照并将其放在Throwable对象中。这就是为什么你只能抓住Throwable的东西。此外,上述示例的性能也很差,因为在没有必要的情况下会收集错误资源。

在两个已知的Throwable类型

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

当程序无法恢复时,这些情况被归类为Errors,如耗尽内存或遇到编译错误。

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

另外,捕获Throwable是一种不好的做法(你能处理像Errors那样无法处理的事情吗?)。当您想要<#34; 抓住我的代码中的任何内容&#34;时,请抓住Exception

答案 3 :(得分:0)

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

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

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

我认为我帮助了你,如果它确实有帮助,那么我的答案就可以接受了。