【问题标题】:Why Object reference is not allowed in catch block? [duplicate]为什么在 catch 块中不允许对象引用? [复制]
【发布时间】:2013-06-08 17:12:15
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      来自 javadocs:

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

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

      【讨论】:

        【解决方案3】:

        如果 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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-01-01
            • 2012-10-04
            • 1970-01-01
            • 2017-02-08
            • 2023-03-03
            • 1970-01-01
            • 2019-05-25
            • 1970-01-01
            • 2017-12-10
            相关资源
            最近更新 更多