public class FinallyTest { public static void main(String[] args) { System.out.println("test1:" + testFinal1()); System.out.println("test2:" + testFinal2()); System.out.println("test3:" + testFinal3()); System.out.println("test4:" + testFinal4()); } static int testFinal1() { int i = 1; try { return i; } finally { System.out.println("in testFinal1():finally 肯定会被执行的!"); i = 48; } } static String testFinal2() { String str = "try"; try { return str; } finally { System.out.println("in testFinal2():finally 肯定会被执行的!"); str = "finally"; } } static StringBuilder testFinal3() { StringBuilder build = new StringBuilder("try "); try { return build; } finally { System.out.println("in testFinal3():finally 肯定会被执行的!"); build.append("finally"); build = new StringBuilder("你猜我是谁!"); } } @SuppressWarnings("all") static String testFinal4() { try { return "return in try"; } finally { System.out.println("in testFinal4():finally 肯定会被执行的!"); return "return in finally"; } } }
输出为:
in testFinal1():finally 肯定会被执行的!
test1:1
in testFinal2():finally 肯定会被执行的!
test2:try
in testFinal3():finally 肯定会被执行的!
test3:try finally
in testFinal4():finally 肯定会被执行的!
test4:return in finally
* try finally特性:
在try中的return语句会将返回结果值压栈,然后转入到finally子过程,等到finally子过程执行完毕之后
(没有return),再返回。
finally的语句是在方法return之前执行的,而且如果finally中有return语句的话,方法直接结束,不再
返回栈中的值。
java中方法调用都是采用传值模式,所以如果在finally中改变了引用类型的对象的值,则return返回后
的结果也被改变。(实际上返回的是对象引用,并没有被改变,在finally中是直接对对象引用指向的
对象进行了修改)
在一个try-finally 语句中,finally 语句块总是在控制权离开try 语句块时执行的。
当try 语句块和finally 语句块都意外结束时,在try 语句块中引发意外结束的原因将被丢弃,而整个try-finally
语句意外结束的原因将于finally 语句块意外结束的原因相同。
总之,每一个finally 语句块都应该正常结束,除非抛出的是不受检查的异常。
千万不要用一个return、break、continue 或throw 来退出一个finally 语句块,并且千万不要允许将一个受
检查的异常传播到一个finally 语句块之外去。
如果一个catch 子句要捕获一个类型为E 的被检查异常,而其相对应的try 子句不能抛出E 的某种子类型的
异常,那么这就是一个编译期错误。但是捕获Exception 或Throwble 的catch 子句是合法的,不管与其
相对应的try 子句的内容为何。
System.exit 将立即停止所有的程序线程,它并不会使finally 语句块得到调用,但是它在停止VM 之前会
执行关闭挂钩操作。
//当你处理IO流,在finally 语句块中调用close 方法时,要用一个嵌套的try-catch语句来保护它,以防止IOException 的传播。 static void copy(String src, String dest) throws IOException { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(src); out = new FileOutputStream(dest); byte[] buf = new byte[1024]; int n; while ((n = in.read(buf)) > 0) out.write(buf, 0, n); } finally { //in可能抛出异常导致out无法关闭。 //if (in != null) in.close(); //if (out != null) out.close(); closeIgnoringException(in); closeIgnoringException(out); } } private static void closeIgnoringException(Closeable c) { if (c != null) { try { c.close(); } catch (IOException ex) { // There is nothing we can do if close fails } } }
相关推荐
这个特性使得`finally`成为处理资源清理,如关闭文件流、数据库连接等操作的理想选择。在讨论`finally`语句的执行时机时,我们需要理解Java的异常处理机制。 Java的异常处理机制由`try-catch-finally`结构组成。`...
4. 异常处理:Java提供了一套完整的异常处理机制,通过try、catch、finally等语句,能够优雅地处理程序运行中可能出现的异常情况。 5. 跨平台性:Java程序能够在任何安装了JVM的平台上运行,这使得Java应用的部署和...
在try语句中声明的资源会在finally块中自动关闭,无论是否发生异常。这适用于实现了`AutoCloseable`(包括`Closeable`)接口的对象。例如: ```java try (InputStream is = new FileInputStream("xx"); ...
这是 `finally` 关键字的核心特性,确保资源清理逻辑总是能够被执行,比如关闭文件、释放内存等。 以下是一个简单的例子: ```cpp #include void doSomething() { std::cout 块中" ; // 模拟可能出现异常的...
同时,Python还支持finally子句,确保在任何情况下都能执行某些清理操作。 Python的模块化设计也是其强大之处。通过import语句,我们可以导入其他Python文件作为模块,实现代码的复用和组织。了解如何创建和使用...
Java 异常处理新特性 Java 异常处理新特性是在 Java7 中引入的一种新的异常处理机制,它提供了一种更加简洁、可靠的方式来处理资源使用异常。这种机制称为 try-with-resources,实际上是自动调用资源的 close() ...
在Java编程语言中,异常处理是一项关键特性,用于在程序执行过程中处理可能出现的错误或异常情况。`try-catch-finally`结构是Java提供的一种优雅的处理异常的方式,确保了程序在遇到错误时能正常运行并有机会清理...
以上只是“第七章高级类特性”中可能涵盖的一些关键点,具体的学习内容还会涉及到这些特性的实际应用和示例,以及如何结合其他Java特性来解决实际问题。掌握这些高级类特性将极大地提高你作为Java开发者的技能和效率...
这是`finally`块的核心特性,它用于确保某些代码无论在何种情况下都会被执行,例如关闭文件流、释放资源等。即使在`try`或`catch`块中有`return`语句,`finally`块仍然会先执行。在这个过程中,函数会将`try`或`...
以下是根据书名和描述所涉及的一些关键知识点: 1. **JVM结构与工作原理**: - 类加载机制:了解类如何被加载、验证、准备、解析和初始化,以及双亲委托模型。 - 运行时数据区:包括堆、方法区、虚拟机栈、本地...
`)总是会被执行,这展示了`finally`的关键特性。 在异常处理中,`finally`的主要作用是确保必要的清理工作得以完成,如关闭文件流、网络连接或其他资源。在没有`finally`的情况下,如上面提到的`WithoutFinally`类...
总结来说,`finally`块的特性在于其确定性。无论`try`块中的代码是否抛出异常,或者`catch`块是否捕获到异常,`finally`块的代码都将无条件执行。这是确保资源释放、日志记录等关键操作得以完成的关键机制。在编写...
在Powershell编程中,`Finally`语句是异常处理机制的一个重要组成部分,它用于确保在发生异常或者脚本被用户中断(如通过Ctrl+C)时,...在实际编程中,我们应当充分利用这一特性来编写更稳定、可靠的Powershell脚本。
这个特性允许在`try`块中声明资源,这些资源会在`finally`块中自动关闭,避免了手动管理资源,减少潜在的资源泄露: ```java try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { // ...
本节将基于这个主题,结合38套java高级架构视频教程,探讨一些重要的Java高级特性。 1. **多线程编程**:Java以其强大的并发支持而闻名。书中会讲解`Thread`类和`Runnable`接口的使用,以及如何通过`...
在"C#语言特性学习(快速上手)"这个主题中,我们将深入探讨C#的一些核心概念,帮助你快速掌握并熟练运用。 首先,我们要了解的是变量与常量。在C#中,变量是存储数据的容器,可以改变其值。你可以声明各种类型的...
以下是对.NET特性的一些详细说明: 1. **面向对象编程**:.NET支持全面的面向对象编程(OOP)特性,如封装、继承、多态和抽象。C#、VB.NET等语言都是基于此理念设计的,它们提供了丰富的关键字和语法来实现这些概念...
标题 "C#课件教案PPT特性共11页.pdf.zip" 暗示这是一个包含C#编程语言教学材料的压缩文件,其中主要是PPT演示文稿,共有11页,用于详细介绍C#的一些关键特性。这个压缩包可能被设计为教育工作者或学生使用的资源,...
C#6.0是.NET Framework的重要更新,引入了一系列新的特性和语法糖,旨在提升开发效率和代码可读性。以下是对这些新特性的详细解析: 1. **Null条件操作符(?.)** C#6.0引入了“?.”操作符,用于安全地访问可能...