以前只知道不管 try 语句块正常结束还是异常结束,finally 语句块是保证要执行的。但是以下情况finally是不执行的!
1)只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行;
2)在 try 语句块中执行了 System.exit (0) 语句,终止了 Java 虚拟机的运行,finally是不执行的!
3)当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。
4)突然死机或者断电!
如果 try 语句块正常结束,那么在 try 语句块中的语句都执行完之后,再执行 finally 语句块。
如果 try 中有控制转移语句(return、break、continue)呢? finally 语句块是在控制转移语句之前执行!
如果 try 语句块异常结束,如果 catch 语句块中包含控制转移语句呢? finally 语句块还是在这些控制转移语句之前执行!
控制转移语句除了 return 外,还有 break 和 continue。另外,throw 语句也属于控制转移语句。其中 return 和 throw 把程序控制权转交给它们的调用者(invoker),而 break 和 continue 的控制权是在当前方法内转移。
Java 虚拟机是如何编译 finally 语句块?实际上,Java 虚拟机会把 finally 语句块作为 subroutine,直接插入到 try 语句块或者 catch 语句块的控制转移语句之前。
但是,还有另外一个不可忽视的因素,那就是在执行 subroutine(也就是 finally 语句块)之前,try 或者 catch 语句块会保留其控制转移语句的返回值到本地变量表(Local Variable Table)中。待 subroutine 执行完毕之后,再恢复保留的返回值到操作数栈中,然后通过 return 或者 throw 语句将其返回给该方法的调用者(invoker)。上面提到过 return、throw 和 break、continue 的区别,对于这条规则(保留返回值),只适用于 return 和 throw 语句,不适用于 break 和 continue 语句,因为它们根本就没有返回值。
分享到:
相关推荐
《深入理解C#》是一本深受程序员喜爱的书籍,尤其对于C#初学者来说,它提供了全面且深入的C#语言教程。这本书以其清晰的解释和实用的例子,帮助读者建立起坚实的C#编程基础。以下是对书中核心知识点的详细阐述: 1....
深入理解Python的特性是提升编程技能的关键。这份名为"深入理解Python特性_1592298155816.pdf"的文档,显然是为了帮助读者更全面地掌握这门语言的核心特性。 首先,Python的动态类型系统是其主要特点之一。这意味着...
深入理解`final`、`finally`和`finalize`,开发者可以编写更加健壮和高效的代码。`final`帮助保持代码的稳定性和防止意外的修改,`finally`保证了资源的正确关闭,而避免使用`finalize`则有助于避免不必要的复杂性和...
《深入理解C#_第3版》是一本针对C#编程语言的深度学习教程,尤其适合Unity游戏开发的初学者。这本书旨在通过详尽的解释和实例,帮助读者从基础知识到高级特性的全面掌握C#语言。以下是该书可能涵盖的一些关键知识点...
深入理解这一主题,对于任何JavaScript开发者来说都是至关重要的。在这个教程中,我们将探索JavaScript异步处理的各个方面,包括事件循环、回调函数、Promise、Async/Await以及generator等。 首先,我们来了解异步...
《深入理解C#(中文第三版)》是C#编程领域的经典著作,旨在帮助开发者全面、深入地掌握C#这门强大的编程语言。本书不仅涵盖了C#的基础语法和特性,还深入探讨了高级主题,包括元数据、反射、类型安全、垃圾回收、...
通过阅读本书,你可以深入了解Java 7的核心技术,并掌握在实际开发中的最佳实践。 Java 7是Java平台的重大升级,它引入了许多创新性改进,包括但不限于以下几点: 1. **多线程改进**:Java 7提供了Fork/Join框架,...
在本文中,我们将深入探讨 `finally` 的使用和一些需要注意的细节,尤其是与Java相关的知识点。 首先,`finally` 通常与 `try-catch` 结构一起使用。在 `try` 块中,我们执行可能会抛出异常的代码。如果发生异常,...
《深入理解Python》是一本深度剖析Python编程语言的著作,旨在帮助读者全面了解Python的核心概念、语法特性以及高级应用。这本书的高清PDF版本包含了书中的每一章内容,并且附带了书签,方便读者快速定位到感兴趣的...
### 深入理解Java异常处理机制 #### 引言 异常处理机制是任何现代编程语言不可或缺的一部分,尤其是在像Java这样的面向对象的语言中更是如此。Java的异常处理机制旨在帮助开发者编写更健壮、更易于维护的代码。...
通过《深入理解C#》这本书,读者不仅可以掌握C#的基本语法,还能深入了解其高级特性和最佳实践。无论是进行桌面应用开发、Web开发,还是移动应用开发,C#都是一门值得深入学习的语言。在实践中不断探索,将理论知识...
《深入理解C# 第二版》是由知名编程专家Jon Skeet撰写的关于C#编程语言的经典著作。这本书针对C#的各个方面提供了深入的解析和实践经验,旨在帮助读者不仅仅是掌握C#的基本语法,更是理解其设计理念和内在机制。下面...
在《深入理解C#(第2版)》中,读者将学习如何正确地使用try-catch-finally语句,以及如何创建自定义异常,从而更好地管理和恢复程序错误。 LINQ(Language Integrated Query)是C# 3.0引入的一项重要特性,它允许...
深入理解这些概念对于编写高效、健壮的Java代码至关重要。 ### final 1. **不可变性**:`final` 关键字用于声明一个变量、方法或类为最终状态,意味着一旦赋值或定义后,其值或状态不能被修改。例如,当一个变量被...
现在让我们深入源码层面来进一步理解这个过程。当解释器遇到`return`语句时,它会创建一个包含返回值的对象,并将其存储在一个内部数据结构中。然后,解释器跳转到`finally`块,执行其中的代码。即使在`finally`块中...
本文将深入探讨Java中的`try-catch-finally`语句块,以及它们在异常处理中的作用。 首先,`try`块是异常处理的起点。在这个代码段中,我们通常会放置可能会抛出异常的代码。当Java执行到可能抛出异常的代码行时,...
要深入理解终止处理程序的工作原理,我们需要了解以下几个关键概念: 1. **线程栈**: 当程序执行到`__try`块时,系统会在当前线程的栈上记录一个终止处理程序的信息。这个信息包含了指向`__finally`块的指针和其他...
通过分析 `12.5-1.js` 和 `try-catch-finally-return-in-finally.js` 文件,可以深入理解这种机制在实际代码中的应用。这些文件可能包含了具体的示例,演示了如何在不同情况下使用 `try-catch-finally` 结构以及 `...
作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益! 本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...