”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 Java 异常处理代码会产生“132Exception in thread main MyExc1”而不是“13Exception in thread main MyExc2”?

为什么 Java 异常处理代码会产生“132Exception in thread main MyExc1”而不是“13Exception in thread main MyExc2”?

发布于2024-11-06
浏览:700

Why does the Java exception handling code produce \

Java中的异常处理:解开歧义

在一个令人费解的Java异常处理场景中,一个大学问题提出了以下代码片段:

// Exception Heirarchy
class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

// Main Class
public class C1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.print(1);
            q();
        }
        catch (Exception i) {
            throw new MyExc2();
        }
        finally {
            System.out.print(2);
            throw new MyExc1();
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception();
        }
    }
}

该问题询问其输出,提供的答案是“13Exception in thread main MyExc2”。然而,正确的答案是“132Exception in thread main MyExc1”。

澄清歧义

要破译这个谜题,必须了解异常的优先级:

  • 原理:当catch或finally块中抛出新的异常时,当前正在处理的异常将被中止。
  • 后果:

    • 当前异常的传播停止。
    • 新异常成为传播异常。
    • 新异常正常展开堆栈,遇到任何适用的 catch 或 finally 块。

追溯执行

将此原则应用于代码:

  1. 初始执行:

    • 第 13 行: MyExc1 被抛出到 q() 的 try 块中。
    • 第 18 行: MyExc1 被 q() 的 catch 块捕获。
    • 第 21 行:执行第 21 行(打印 3)。
  2. Catch 块异常:

    • 第 19 行:MyExc2 被抛出到 main() 的 catch 块中。
    • 第 22 行:MyExc2 中止 MyExc1 的传播。
    • 第 19 行:MyExc2 开始展开堆栈。
  3. Main 的 Try 块中恢复执行:

    • 第 15 行:第 15 行被执行(打印 2)。
    • 第 16 行:MyExc1 被抛出到 main() 的finally 块中。
    • 第 16 行:MyExc1 中止 MyExc2 的传播。
    • 第16行:MyExc1开始展开堆栈(并且仍然受main的finally块的影响)。
  4. Finally Block异常:

    • 第 23 行:在 main() 的 finally 块中抛出异常。
    • 第 23 行:异常中止 MyExc1 的传播。
    • 第 23 行:异常开始展开

输出:

最终输出是“132Exception in thread main MyExc1”,因为传播出去的异常main 方法的主方法是第 16 行抛出的 MyExc1。第 19 行抛出的 MyExc2 在第 16 行抛出 MyExc1 时中止。

最新教程 更多>
  • 如何在 PHP 中使用 array_push() 处理多维数组?
    如何在 PHP 中使用 array_push() 处理多维数组?
    使用 PHP 的 array_push 添加元素到多维数组使用多维数组可能会令人困惑,特别是在尝试添加新元素时。当任务是将存储在 $newdata 中的循环中的数据附加到给定 $md_array 内的子数组“recipe_type”和“cuisine”时,就会出现此问题。要实现此目的,您可以利用ar...
    编程 发布于2024-11-06
  • Python 第 00 天
    Python 第 00 天
    今天,我开始了我的个人挑战,#100DaysOfCode。为了这个挑战,我选择学习Python,因为我的目标是成为一名数据分析师。 第 2 章: 变量和字符串 我用来学习 Python 的材料是 Eric Matthes 写的一本名为《Python Crash Course》的书。它对学习非常有帮...
    编程 发布于2024-11-06
  • PDO、准备好的语句或 MySQLi:哪一个最适合您的 PHP 项目?
    PDO、准备好的语句或 MySQLi:哪一个最适合您的 PHP 项目?
    揭秘 PDO、Prepared statements 和 MySQLi在 PHP 数据库交互领域,初学者经常会遇到从遗留 mysql_ 过渡的建议* 函数适用于更现代的选项,如 PDO、准备好的语句或 MySQLi。虽然访问和操作数据库的基本目标仍然存在,但每种技术都提供了独特的优势和细微差别。PD...
    编程 发布于2024-11-06
  • WordPress 主题开发:终极文件夹结构指南
    WordPress 主题开发:终极文件夹结构指南
    WordPress 是构建网站时的灵活框架。您可以构建任何类型的网站,例如 CMS、电子商务、单一登陆页面等。这里我将讨论 WordPress 项目的结构,以便您可以制作自定义主题。当您为自己或客户制作网站时,流行的主题(例如 divi、Astra、Neve、oceanwp 等)是一些不错的选择。但...
    编程 发布于2024-11-06
  • 工具和资源 [实时文档]
    工具和资源 [实时文档]
    CSS https://unsplash.com = 示例图像 https://uifaces.co = 示例用户面部图像 https://extract.pics/ = 从网站提取所有图像 https://color.adobe.com/ = 上传渐变图像并获取十六进制颜色代码 ...
    编程 发布于2024-11-06
  • 如何在 JavaScript 中检查字符串是否包含数组中的任何子字符串?
    如何在 JavaScript 中检查字符串是否包含数组中的任何子字符串?
    使用 JavaScript 数组查找字符串中的子字符串为了确定字符串是否包含数组中的任何子字符串,JavaScript 提供了灵活的方法.Array Some Methodsome 方法迭代数组,提供回调函数来测试每个元素。要检查子字符串,请使用 indexOf() 方法搜索字符串中的每个数组元素:...
    编程 发布于2024-11-06
  • Laravel Livewire:它是什么以及如何在您的 Web 应用程序中使用它
    Laravel Livewire:它是什么以及如何在您的 Web 应用程序中使用它
    Livewire 是 Laravel 生态系统中最重要的项目之一,专门针对前端开发。 Livewire v3 最近发布了,让我们来探讨一下 Livewire 是什么,以及什么样的项目适合其架构。 Livewire 的独特之处在于它允许开发“现代”Web 应用程序,而无需使用专用的 JavaScrip...
    编程 发布于2024-11-06
  • C++中通过空指针调用方法可以不崩溃吗?
    C++中通过空指针调用方法可以不崩溃吗?
    C 中通过空指针调用方法的意外行为 在提供的代码片段中,通过空指针调用方法,但是令人惊讶的是,该方法调用似乎执行时没有崩溃。这种不寻常的行为提出了一个问题:这是 C 标准允许的还是仅仅是实现优化?解释在于 C 中方法调用的本质。当调用对象的方法时,编译器知道该对象的类型,因此知道要执行的方法的地址。...
    编程 发布于2024-11-06
  • 如何在Python中对列表进行减法?
    如何在Python中对列表进行减法?
    列表相减:计算差值Python 中的列表可以包含各种元素。为了对列表执行数学运算(例如减法),我们采用特定的方法或技术。让我们探讨如何从一个列表中减去另一个列表。使用列表理解进行逐元素减法一种方法是利用列表理解,它会迭代第一个列表并计算差异,同时保留原始顺序:[item for item in x ...
    编程 发布于2024-11-06
  • 如何在 Python 中检查生成器是否为空?
    如何在 Python 中检查生成器是否为空?
    检测空生成器初始化在Python中,生成器是一次产生一个值的迭代器。因此,从一开始就确定发电机是否为空可能是一个挑战。与列表或元组不同,生成器没有固有的长度或 isEmpty 方法。解决挑战为了解决这个问题,一种常见的方法是使用辅助函数查看生成器中的第一个值而不消耗它。如果 peek 函数返回 No...
    编程 发布于2024-11-06
  • ## 想从Python高效调用Java?探索 Py4J 作为 JPype 的替代品!
    ## 想从Python高效调用Java?探索 Py4J 作为 JPype 的替代品!
    从 Python 调用 Java:Py4J 作为 JPype 的替代品从 Python 调用 Java 代码有几个潜在的解决方案。其中一个选项 JPype 可能难以编译,并且由于缺乏最新版本而显得不活跃。然而,另一种解决方案是 Py4J,这是一个简单的库,提供了一个方便的接口,用于从 Python ...
    编程 发布于2024-11-06
  • 小Swoole数据库
    小Swoole数据库
    Small Swoole Db 2.3引入左连接: $selector = (new TableSelector('user')) ->leftJoin('post', 'messageOwner', 'message') ; $selector->where() -&g...
    编程 发布于2024-11-06
  • 如何使用汇编指令优化 __mm_add_epi32_inplace_purego 函数,以在位置总体计数操作中获得更好的性能?
    如何使用汇编指令优化 __mm_add_epi32_inplace_purego 函数,以在位置总体计数操作中获得更好的性能?
    使用程序集优化 __mm_add_epi32_inplace_purego此问题旨在优化 __mm_add_epi32_inplace_purego 函数的内部循环,该函数对字节数组执行位置填充计数。目标是通过利用汇编指令来提高性能。内部循环的原始 Go 实现: __mm_add_epi32_...
    编程 发布于2024-11-06
  • 使用 React Router 进行导航 React Js 第一部分 React 应用程序中的路由指南
    使用 React Router 进行导航 React Js 第一部分 React 应用程序中的路由指南
    欢迎回到我们的 React 系列!在之前的文章中,我们介绍了组件、状态、道具和事件处理等基本概念。现在,是时候使用 React Router 探索 React 应用程序中的路由了。路由允许您在应用程序内的不同视图或组件之间导航,从而创建无缝的用户体验?. 什么是 React 路由器?...
    编程 发布于2024-11-06
  • file_get_contents() 可以用于 HTTP 文件上传吗?
    file_get_contents() 可以用于 HTTP 文件上传吗?
    使用 HTTP Stream Context 通过 file_get_contents() 上传文件使用 cURL 扩展可以无缝地实现通过 Web 表单上传文件。不过,也可以使用 PHP 的 file_get_contents() 函数结合 HTTP 流上下文来执行文件上传。Multipart Co...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3