为什么下面的代码不起作用?而每个类都从Object类扩展。
try {
// simple code , throw some exception
} catch (Object e) {
// handle the exception
}
如果Exception类是从对象类继承而不是为什么在catch块中不允许Object引用?
如果有人知道上述问题的答案,请告诉我。
答案 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),这意味着数组对象是此异常的原因,更好的异常处理涉及捕获特定问题。
我认为我帮助了你,如果它确实有帮助,那么我的答案就可以接受了。