当前位置: 首页 > 知识库问答 >
问题:

多捕获是如何在Java7中实现的?

酆浩邈
2023-03-14

Java7编译器是如何处理多捕获块的?一个简单的实现是生成字节码,就好像存在多个catch块一样。然而,我从多个来源得到的信息表明,情况并非如此--处理多个异常类型的catch块在编译期间不会产生重复的字节码。

那么,它是如何工作的呢?是否有一个新的字节码指令告诉JVM关于多捕获块?

共有1个答案

丰胤运
2023-03-14

基于Java虚拟机规范,异常编译如下(摘要):

  • 尝试代码正常运行
  • 每个catch块都像一个单独的方法一样编译
  • 存在一个异常表,可将执行流重定向到右侧捕获块

使用multicatch子句时,catch块是相同的(只出现一次),但异常表将包含多一个具有相同from、to和target值的条目。

例如,以下代码:

public static void main(String args[]) throws InterruptedException {
    try {
        System.out.println("why not?");
    } catch (IllegalArgumentException e) {
        System.out.println("here");
    } catch (IllegalStateException | ArithmeticException e) {
        System.out.println("there");
    }
}

生成以下异常表(在我的计算机上):

   from    to  target type
       0     8    11   Class java/lang/IllegalArgumentException
       0     8    23   Class java/lang/IllegalStateException
       0     8    23   Class java/lang/ArithmeticException
 类似资料:
  • Try-catch旨在帮助处理异常。这意味着它将帮助我们的系统更加健壮:尝试从一个意外事件中恢复。 我们怀疑在执行and指令(发送消息)时可能会发生一些事情,因此它被封闭在try中。如果发生了几乎意想不到的事情,我们可以做一些事情:我们编写catch。我不认为我们打电话只是为了记录异常。我认为catch块是为了给我们从错误中恢复的机会。 现在,假设我们可以从错误中恢复,因为我们可以修复错误。再试一

  • 问题内容: 我对实际的.NET实现及其背后的决定感到好奇。 例如,在Java中,匿名类中使用的所有捕获值都必须是最终值。NET中似乎已删除了此要求。 此外,与参考类型相反,值类型的捕获值的实现方式是否有所不同? 谢谢 问题答案: 找出实现方式的最简单方法就是尝试一下。编写一些代码,使用捕获的变量,对其进行编译,然后在Reflector中对其进行查看。请注意,捕获的是 变量 ,而不是 value 。

  • 我知道Java8为静态方法添加了新的隐式类型特性,我认为这可能与此有关。我试图重构参数并将它们强制转换为预期的参数,但结果是相同的错误: 调用?

  • 问题内容: 我正在研究启动多个进程和数据库连接的python脚本。我不时地想用信号杀死脚本,我想进行一些清理。 在Perl中,我可以这样做: 如何在Python中做类似的事情? 问题答案: 用以下方式注册你的处理程序: 代码改编自此处。

  • 本文向大家介绍如何在JavaScript中实现多态?,包括了如何在JavaScript中实现多态?的使用技巧和注意事项,需要的朋友参考一下 多态性 多态 是面向对象编程(OOP)的宗旨之一。它有助于设计对象,使其可以与特定提供的对象共享或覆盖任何行为。多态性 利用继承的 优势来实现这一点。 在以下示例中,子对象(例如“板球”和“网球”)已覆盖从父对象“游戏”调用的“选择”方法,并分别返回了新字符串