`
codecook
  • 浏览: 42433 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

finally结构的注意点(二)

阅读更多
我在上一篇中总结了java中finally结构的3个典型问题,以及展示了finally结构可能产生的副作用。在这一篇中,我将继续展示finally的一些特点。
如果try块中有导致try块提前退出的语句(如return语句和throw语句,我们以return语句为例),那么finally会在return语句之前先执行。
比如有如下函数:
	public static int testVariableChangeInFinally()
	{
		int i=0;
		try{
			i=1;//步骤1
			return i;//步骤2
		}finally{
			i=2;//步骤3
		}
	}

那么,函数真正的执行顺序应该是步骤1->步骤3->步骤2。然而执行该函数时,函数的返回值却是1。why?这导致我们有2个新的假设:

1,执行顺序不是我们想的那样;
2,步骤3根本就没执行;

第2个假设是很好排除的,我们在步骤3下面再加入一条输出语句,形成代码如下
	/**
	 * 
	 * @return
	 */
	public static int testVariableChangeInFinally()
	{
		int i=0;
		try{
			i=1;
			return i;
		}finally{
			i=2;
			System.out.println("finally");
		}
	}

运行函数,发现控制台确实打印出了finally字符串,说明步骤3确实是被执行过了。说明假设2不成立。(如果是怀疑是乱排序了,那么可以用eclipse一步一步调试)

难道执行顺序不是步骤1->步骤3->步骤2吗?答案是只对了1半。
实际上,在虚拟机内部,return语句是分为2步的,第一步是把返回值压入到调用者的栈中,第二步是返回到调用者的栈。因此,我们可以把我们的代码想象成如下形式:
	/**
	 * 
	 * @return
	 */
	public static int testVariableChangeInFinally() {
		int i = 0;
		try {
			i = 1;//步骤1
			int temp = i;//步骤2
			return temp;//步骤3
		} finally {
			i = 2;//步骤4
		}
	}

因此,执行顺序应该是步骤1->步骤2->步骤4->步骤3
所以,函数也就返回了1,而不是2。我们也可以通过eclipse的单步调试观察i值的变化,发现i也确实变成了2。
分享到:
评论

相关推荐

    finally结构的注意点(一)

    在本文中,我们将深入探讨 `finally` 的使用和一些需要注意的细节,尤其是与Java相关的知识点。 首先,`finally` 通常与 `try-catch` 结构一起使用。在 `try` 块中,我们执行可能会抛出异常的代码。如果发生异常,...

    try-catch-finally捕获异常

    下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try块 try块是try-catch-finally语句的核心部分,用于包装可能出现异常的代码。try块中的代码在执行时,如果出现异常,会被catch块捕获和处理。...

    java 中finally语句块与return的执行关系

    在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细探讨 finally 语句块与 return 的执行关系。 首先,需要了解的是,在 try-finally 或者 catch-finally 中,如果 try 或者 ...

    try-finally-return-in-finally.rar_return

    在编程语言中,`try-finally` 结构是用来确保一段代码在任何情况下(无论是正常执行还是抛出异常)都会被执行的语句块。这个结构在处理资源管理,比如文件流关闭或者网络连接断开等场景时特别有用。当我们谈论`...

    java.try-catch-finally(解决方案).md

    try-catch-finally结构是Java中处理异常的基础,其基本用法包括:try块用于包裹可能出现异常的代码,catch块用于捕获并处理特定类型的异常,而finally块则用于执行无论是否发生异常都需要执行的代码,例如资源清理和...

    java.try-catch-finally.md

    在介绍的知识点中,我们看到了一段具体的Java代码,用于演示如何使用`try-catch-finally`来处理除以零的异常情况。下面将详细介绍该结构的三个部分:`try`块、`catch`块和`finally`块。 首先,`try`块用于包裹可能...

    try except finally的用法.doc

    try-except-finally结构在C++中主要用于异常处理,能够增强程序对错误情况的响应和恢复能力。try块用于包含可能引发异常的代码,这包括诸如除以零、文件读写错误、网络断开等运行时错误。如果try块中的代码执行中...

    java.try-catch-finally(处理方案示例).md

    使用`try-catch-finally`结构时,需要注意以下几点: 1. `catch`块的异常类型声明应该由具体到一般排序,即先捕获子类异常,再捕获父类异常。 2. 如果在`catch`或`finally`块中发生异常,原异常信息将丢失,除非进行...

    try-except-finally(处理方案示例).md

    try-except-finally结构是Python语言提供的异常处理机制之一,其工作原理是尝试执行一段可能引发异常的代码,当异常发生时则执行except部分的代码进行异常处理,而无论是否发生异常,finally部分的代码都将被执行,...

    Java 实例 - Finally的用法源代码-详细教程.zip

    但要注意,`finally`块中的`return`语句会覆盖掉`try`或`catch`中的`return`结果。 3. 示例代码: ```java try { // 可能会抛出异常的代码 File file = new File("example.txt"); FileReader fr = new ...

    dotnet C# 在 finally 抛异常会发生什么.rar

    当`finally`块抛出异常时,以下几点值得注意: 1. **异常覆盖**:如果`finally`块中抛出了新的异常,那么原本在`try`块中抛出的异常会被新异常所覆盖。这意味着原始异常的信息将会丢失,除非在`finally`块内部捕获...

    深入浅析java中finally的用法

    使用finally块需要注意以下几点: 1. finally块只能用在try/catch语句中。 2. finally块中的代码一定会被执行,除非程序中止或退出。 3. finally块可以用于释放资源,例如关闭数据库连接、文件流等。 4. finally块...

    Java异常处理之try...catch...finally详解

    在使用多异常捕获应注意两点:(1)多种异常之间用竖线(|)分隔,(2)捕获多种类型的异常时,在catch块中可以使用instanceof关键字来检测异常的类型。 在Java中,try…catch…finally语句块是异常处理的主要形式...

    Java软件开发实战 Java基础与案例开发详解 10-5 finally关键字 共7页.pdf

    **注意**:`finally`块可以不与`catch`块一起使用,但是必须与`try`块一起使用。 #### finally关键字的典型应用场景 `finally`关键字最常见的应用场景之一是在需要释放资源的情况下。例如,在与数据库交互的过程中...

    try catch finally的执行顺序深入分析

    需要注意的是,虽然`finally`块总会执行,但并不是所有情况都适用。如果`try`或`catch`块中包含`System.exit()`这样的代码,它会导致程序立即终止,`finally`块将不会被执行。此外,如果在多线程环境下,线程被中断...

    java.try-except-finally(解决方案).md

    Java的异常处理机制是其语言的一个重要特性,提供了结构化错误处理的能力。在Java中,异常处理主要通过try、catch和finally三个关键字来完成。try块用于包含可能抛出异常的代码;catch块用于捕获并处理异常;finally...

    Java try catch finally异常处理组合详解

    try catch finally组合的语法结构如下: ```java try { // 可能会抛出异常的语句 } catch (异常类型 e) { // 异常处理语句 } finally { // 资源释放语句 } ``` 多个catch组合: 多个catch组合用于捕获多种类型...

    C++异常处理 try,catch,throw,finally的用法

    3. finally块的使用:在SEH中,finally块用于释放资源,但是需要注意在ExitThread/ExitProcess/abort等函数时,finally块不会被执行。 高级使用: 1. 使用构造函数防止资源Leak(More effective C++ #10) 2. 禁止...

    英语二小作文结构及常用句型.doc

    【英语二小作文结构与常用句型解析】 在准备考研英语的过程中,小作文部分占据了十分重要的地位,其分值为10分,虽然篇幅较短,但要求内容精炼、结构清晰。小作文通常涉及多种类型,如感谢信、祝贺信、道歉信、邀请...

Global site tag (gtag.js) - Google Analytics