【发布时间】:2013-06-08 17:12:15
【问题描述】:
为什么下面的代码不起作用?而每个类都是从 Object 类扩展而来的。
try {
// simple code , throw some exception
} catch (Object e) {
// handle the exception
}
如果异常类是从对象类继承的,那么为什么在catch块中不允许对象引用?
如果有人知道上述问题的答案,请告诉我。
【问题讨论】:
标签: java
为什么下面的代码不起作用?而每个类都是从 Object 类扩展而来的。
try {
// simple code , throw some exception
} catch (Object e) {
// handle the exception
}
如果异常类是从对象类继承的,那么为什么在catch块中不允许对象引用?
如果有人知道上述问题的答案,请告诉我。
【问题讨论】:
标签: java
catch 子句的参数必须继承自 Throwable
这个约束从一开始就被放入 Java 语言中,并且是对 JRE 编写者的承诺的一部分,他们可以利用它来帮助他们加快速度。
【讨论】:
来自 javadocs:
Throwable 类是所有错误和异常的超类 Java 语言。仅作为此类实例的对象(或 它的子类之一)由 Java 虚拟机抛出或可以 由 Java throw 语句抛出。 同样,只有这个类或 它的子类之一可以是 catch 子句中的参数类型。为了 异常、Throwable 和任何异常的编译时检查的目的 Throwable 的子类,它不是任何一个的子类 RuntimeException 或 Error 被视为已检查的异常。
在此处阅读更多信息:http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html
【讨论】:
如果 Object where 在 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 and catch 机制不是为了做基本的流控制,而是处理意外结果。当部分代码遇到意外结果时,它抛出一条消息表明他无法继续,他将中止下一条语句并将执行返回到上面的范围。他基本上是在说我收到一个错误,无法继续,有人处理这种情况。对于处理这种情况的人来说,需要收集资源:JVM 将对整个堆栈进行快照并将其放入 Throwable 对象中。这就是为什么你只能捕捉到Throwable 的东西。此外,上述示例的性能也很差,因为错误资源会在不必要的地方收集。
Throwable 类型程序可以恢复的情况被归类为Exceptions,例如尝试打开丢失的文件、连接到无法访问的位置、尝试访问错误的 URL 等等。
当程序无法恢复时,这些情况被归类为Errors,例如内存不足或遇到编译错误。
虽然您仍然可以编写自己的继承自 Throwable 的类,但上述两种类型已经涵盖了所有可能的错误类型(可恢复或不可恢复),因此您可能不会看到任何不是来自的捕获任何一个。
另外,捕获Throwable 是一种不好的做法(你能处理像Errors 这样无法处理的事情吗?)。当你想“在我的代码中捕捉任何东西”时,捕捉Exception
【讨论】:
您似乎是编程新手。无论如何,Object 是 java 类层次结构的根,并且从该层次结构中定义了 Throwable 层次结构,如果存在相关问题,则其后代用于自行抛出或被抛出。
基本上你需要学习的只是错误和异常可以在catch块中使用,因为我们跟踪发生的问题而不是导致问题的对象。
所以如果你得到 ArrayOutOfBoundsException(它是从 Exception 派生的,而 Exception 是从 Throwable 派生的),这意味着一个数组对象是这个 Exception 的原因,更好的异常处理涉及到特定问题的捕获。
我假设我帮助了你,如果它真的有帮助,那么我的回答是可以接受的。
【讨论】: