`

finally解析

    博客分类:
  • java
阅读更多
一.finally 中的语句什么时候会不执行
package com.util.finallyTest;

/**
 * finally 中的语句什么时候会不执行??
 * @author chenxiaobing
 *
 */
public class Test
{

	/**
	 * 1.当在try之前代码便报错或在try之前便使用return 返回,则finally中的语句不会执行	 
           * @return
	 */
	public static int test()
	{
		int i = 1;
		// if(i == 1)  return 0; //若去掉改行的注释,则下面的语句均不会执行

		System.out.println("the previous statement of try block");
		i = i / 0;

		try
		{
			System.out.println("try block");
			return i;
		}
		finally
		{
			System.out.println("finally block");
		}
	}

	/**
	 * 2.当在 try 语句块中执行了 System.exit (0) 语句,终止了 Java 虚拟机的运行,则finally中的语句不会执行
	 * @return
	 */
	public static int test1()
	{
		int i = 1;
		try
		{
			System.out.println("try block");
			System.exit(0);
			return i;
		}
		finally
		{
			System.out.println("finally block");
		} 
	}
	/**
	 * 3.当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。
	 * 还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了
	 * 
	 */
	
	
	
	public static void main(String[] args)
	{
		//System.out.println("return value of test(): " + test());
		System.out.println("return value of test(): " + test1());
	}
}



二.finally 中语句的执行顺序
package com.util.finallyTest;

/**
 * 
 * @author chenxiaobing
 *
 */
public class Test1
{
	/**
	 * finally 语句块是在 try 或者 catch 中的 return 语句之前执行的
	 * 输出:
	 *  try block 
 		exception block 
 		finally block 
 		reture value of test() : 2 
	 * @return
	 */
	public static int test()
	{
		int i = 1;

		try
		{
			System.out.println("try block");
			i = 1 / 0;
			return 1;
		}
		catch (Exception e)
		{
			System.out.println("exception block");
			return 2;
		}
		finally
		{
			System.out.println("finally block");
		}
	}
	
   /**
    * finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。 
    * 由此 finally 中的 return 1;语句要在 try 中的 return 0;语句之前执行
    * @return 1 返回值为 1;
    */
   public static int getValue()
	{
		try
		{
			return 0;
		}
		finally
		{
			return 1;
		}
	}

    /**
     * 关于 Java 虚拟机是如何编译 finally 语句块的问题,有兴趣的读者可以参考《 The JavaTM Virtual Machine Specification, Second Edition 》中 7.13 节
     *  Compiling finally。那里详细介绍了 Java 虚拟机是如何编译 finally 语句块。实际上,Java 虚拟机会把 finally 语句块作为 subroutine
     *  (对于这个 subroutine 不知该如何翻译为好,干脆就不翻译了,免得产生歧义和误解。)直接插入到 try 语句块或者 catch 语句块的控制转移语句之前。
     *  但是,还有另外一个不可忽视的因素,那就是在执行 subroutine(也就是 finally 语句块)之前,try 或者 catch 语句块会保留其返回值到本地变量表(Local Variable Table)中。
     *  待 subroutine 执行完毕之后,再恢复保留的返回值到操作数栈中,然后通过 return 或者 throw 语句将其返回给该方法的调用者(invoker)。
     *  请注意,前文中我们曾经提到过 return、throw 和 break、continue 的区别,对于这条规则(保留返回值),
     *  只适用于 return 和 throw 语句,不适用于 break 和 continue 语句,因为它们根本就没有返回值。
     * @return  1 返回1
     */
	public static int getValue1()
	{
		int i = 1;
		try
		{
			return i;
		}
		finally
		{
			i++;
		}
	} 

	 /**
	  * 
	  * @return 5  返回值为5
	  */
	 public static int getValue2() { 
	        int i = 1; 
	        try { 
	                 i = 4; 
	        } finally { 
	                 i++; 
	                 return i; 
	        } 
	 } 

	 /**
	  * 
	  * @return 5  返回值为5
	  */
	 public static int getValue3() { 
	        int i = 1; 
	        try { 
	                 i = 4; 
	        } finally { 
	                 i++; 
	        } 
	        return i; 
	 } 
	public static void main(String[] args)
	{
		System.out.println("reture value of test() : " + test());
		System.out.println("return value of getValue(): " + getValue()); 

	}
}
分享到:
评论

相关推荐

    Java中finally和return的关系实例解析

    主要介绍了Java中finally和return的关系实例解析,总结了二者的关系,然后分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    java抛出异常与finally实例解析

    主要介绍了java抛出异常与finally实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    完全解析Java编程中finally语句的执行原理

    主要深度介绍了Java编程中finally语句的执行原理,细致讲解了finally在异常处理中的流程控制作用,需要的朋友可以参考下

    delphi解析json处理单元

    json串解析单元。简单易用,没有bug。 使用方法如下: var ResponseJson: string; Json, childJson: TlkJSONobject; begin Json := TlkJson.ParseText(ResponseJson) as TlkJsonObject; try Success := Trim...

    java面试题解析困惑之一

    java面试题解析困惑之final、finally和finalize的区别

    实例解析js中try、catch、finally的执行规则

    本文主要通过实例解析来更好的了解js中try、catch、finally的执行规则,具有很好的参考价值,下面跟着小编一起来看下吧

    使用Java XML解析器实现一个简单的XML文档操作.txt

    这个代码实现了一个简单的XML文档操作。首先导入了所需的库,然后定义了一个名为SimpleXML的类,并在...在finally块中关闭了所有的资源。由于使用了DOM解析器来访问XML文档,因此可以方便地获取和修改XML文档中的数据。

    网络获取json解析json以及子线程显示

    } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if (connection != null) { connection.disconnect(); } } } }).start(); } ...

    java解析给定url

    HtmlParse,解析给定url中的中文字符,输出到文本文件中: url:可配置多个 输出路径:可配置 package com.lhs; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import ...

    2016年上半年软件设计师上午真题及答案解析

    新鲜出炉的 2016年上半年软件设计师上午真题及答案解析,不容错过!

    【Python】详解 try-except-else-finally 语句 —— 异常处理完全解读(上)

    目录 一、绪论 二、异常捕获 (Exception catching) 2.1 try-except 语句 2.1.1 基本用法 2.1.2 指定异常类型 2.1.3 小结 2.2 try-except-else 语句 ...不同于语法错法错误 (解析错误),调试 Python 程序时,即便语句

    Java经典面试题(答案解析)

    含基础篇,核心篇,框架篇,微服务篇 1.1.1 面向对象特征 封装,继承,多态和抽象 1、 封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问...1.1.2 final, finally, finalize 的区别。。。

    Java学习题答案

    (20分) 本题三个答题点: a: 两种形式 dtd,schema b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的 根本目的) c: 两种主要方式:dom,sax.答出两种得全分,如能答出saxt,...

    Java程序设计习题(含答案解析).doc

    ( F ) 37、一个异常处理中 finally语句块只能有一个或者可以没有。(F ) 38、语句import java.applet.Applet;最后的Applet是代表类(class)。( T ) 39、类体中private修饰的变量在本类中能访问,类生成的对象也能访问...

    Python语言异常处理测试过程解析

    这篇文章主要介绍了Python语言异常处理测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 (一)异常处理 1.捕获所有异常 try: x = 5 / 0 except:...

    python 上下文管理器及自定义原理解析

    这篇文章主要介绍了python 上下文管理器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python 提供了 with 语法用于简化资源操作的后续清除操作,是 ...

    python错误调试及单元文档测试过程解析

    这篇文章主要介绍了python错误调试及单元文档测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 错误分为程序的错误和由用户错误的输入引起的错误,...

    Python异常处理机制结构实例解析

    首先,Python 完整的异常处理语法结构如下: try: #业务实现代码 except Exception1 as e: ... 如果没有 try 块,则不能有后面的 except 块、else 块和 finally 块。但是也不能只使用 try 块,要

    Interpolation and decimation of digital signals

    The concepts of digital signal processing are playing an increasingly important role in the...are discussed, and finally the ideas behind multistage implementations for increased efficiency are presented

Global site tag (gtag.js) - Google Analytics