为什么在这个 Java 异常处理示例中'MyExc2”异常消失了?
Catch 和 Final 子句中的异常处理
在 Java 中处理异常处理时,掌握 catch 和 finally 子句之间的相互作用至关重要。考虑以下为大学作业提供的示例:
<code class="java">class MyExc1 extends Exception {} class MyExc2 extends Exception {} class MyExc3 extends MyExc2 {} 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(); } } }</code>
要求此代码输出的问题。虽然有些人可能回答“13Exception in thread main MyExc2”,但正确答案是“132Exception in thread main MyExc1”。
为什么 MyExc2 消失
理解的关键正确的输出在于catch 和finally 子句的行为。当 catch 或 finally 块中引发异常时,它会对流程产生重大影响。下面是细分:
- catch 块中的异常: 如果在 catch 块中抛出新异常(如上面的 throw new MyExc2() 所示),则原始异常为“中止了。”当前的执行路径不完整,新的异常将接替向外传播的异常。
-
finally 块中的异常: 类似地,如果在一个finally块,原来的异常也被中止。不过,有一个关键点需要注意:
- Catch 块的finally 块: 如果新的异常是在catch 块的finally 块中抛出的,它仍然会受到该catch 块的约束。 finally 块,如果有的话。
跟踪异常
根据这些原则跟踪执行,我们可以看到:
- main 中的 try 块打印“1”并调用 q()。
- 在 q() 内部,try 块抛出 MyExc1。
- catch 块in q() 默默地处理异常。
- q() 中的 finally 块打印“3”并抛出异常。
-
main 中的 Catch 块:
- MyExc2 被抛出到这个块中,中止原来的 MyExc1。
- 但是,catch 块有一个仍然执行的 finally 块。
-
最后在 main 中的块:
- MyExc1 被抛出到这个块中,中止 MyExc2。
因此,正确的输出是“132Exception in thread main MyExc1”。 MyExc2 异常被“遗忘”,因为在处理 MyExc2 的 catch 块的 finally 块中抛出了一个新异常 (MyExc1)。
以上是为什么在这个 Java 异常处理示例中'MyExc2”异常消失了?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...
