`

Finally的使用总结

    博客分类:
  • Java
阅读更多
//清单一:
public class Test1 {
	public static void main(String[] args) {
		System.out.println("return value of test(): " + test());
	}
	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");
		}
	}
}
//结论:如果在try中遇到异常,如果没有catch,则直接退出,不会执行finally
/*执行结果:the previous statement of try block
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.testfinally.sym.Test1.test(Test1.java:12)
	at com.testfinally.sym.Test1.main(Test1.java:5)
*/
//清单二:
public class Test2 {

	public static void main(String[] args) {
		System.out.println("return value of test(): " + test());
	}

	public static int test() {
		int i = 1;
		try {
			System.out.println("try block");
			System.exit(0);
			return i;
		} finally {
			System.out.println("finally block");
		}
	}
}
//结论同上
/*执行结果:try block*/

//清单三:
public class Test3 {
	public static void main(String[] args) {
		try {
			System.out.println("try block");
			return;
		} finally {
			System.out.println("finally block");
		}
	}
}
//结论:正常情况下,finally先于return执行
/*执行结果:try block
finally block*/

//清单四:
public class Test4 {
	public static void main(String[] args) {
		System.out.println("reture value of test() : " + test());
	}

	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");
		}
	}
}
//结论:当在try中出现异常,则进入catch;这种情况下三个块中return的优先级:如果、//finally中有return,则函数的返回值就为此return的值;如果finally中没有return,而//catch中有return,则最后的返回值就采用此return的值;如果finally中没有//return,catch中也没有return,则最后的返回值就采用try中的return的值。如果在执行//的时候不需要进入到catch,则不用关注catch中的return值
/*执行结果:try block
exception block
finally block
reture value of test() : 2*/

//清单五:
public class Test5 {

	public static void main(String[] args) {
		System.out.println("return value of getValue(): " + getValue());
	}
	public static int getValue() {
		try {
			return 0;
		} finally {
			return 1;
		}
	}
}
//结论同上
/*执行结果:return value of getValue(): 1*/

//清单6:
public class Test6 {

	public static void main(String[] args) {

		System.out.println("return value of getValue(): " + getValue());
	}

	public static int getValue() {
		int i = 1;
		try {
			return i;
		} finally {
			i++;
		}
	}
}
//结论: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 value of getValue(): 1*/

//清单7

public class Test7 {

	public static void main(String[] args) {

		System.out.println("return value of getValue(): " + getValue());
	}

	public static int getValue() {
		int i = 1;
		try {
			i = 4;
		} finally {
			i++;
			return i;
		}
	}
} 
//结论:return在finally中,情况与清单6就不一样了,属于正常返回
/*执行结果:return value of getValue(): 5*/

//清单8
public class Test8 {

	public static void main(String[] args) {

		System.out.println("return value of getValue(): " + getValue());
	}

	public static int getValue() {
		int i = 1;
		try {
			i = 4;
		} finally {
			i++;
		}
		return i;
	}
}
//结论:return在外面也是正常返回
/*执行结果:return value of getValue(): 5*/

//清单9
       public class Test9 { 

	public static void main(String[] args) {

		System.out.println(test());
	}

	public static String test() {
		try {
			System.out.println("try block");
			return test1();
		} finally {
			System.out.println("finally block");
		}
	}

	public static String test1() {
		System.out.println("return statement");
		return "after return";
	}
}
//结论:return test1(); 这条语句等同于 :
//1.           String tmp = test1(); 
//2.           return tmp;  
         /*执行结果:try block
         return statement
         finally block
         after return*/
分享到:
评论

相关推荐

    try-catch-finally执行顺序验证

    总结: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作. (1)如果finally中有return则执行finally中的return; (2)如果finally中无return则执行return var,finally块中的操作不会影响var的...

    JavaSE专题-IO流重点总结(必读).doc

    熟练使用Try---catch---finally,注意: 能和try一起使用的只有catch和finally关键字 Try块里面存放的是有可能发生异常的代码,通常和catch块一起使用,catch块用于处理try块中抛出的异常,finally块不是必须的,通常将...

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

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

    C#异常处理总结及简单实例

    C#异常处理总结及简单实例 一、异常处理的理解? 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。 因此处理这种错误,就称为异常处理。 二、异常处理如何操作? C# 异常处理时建立在...

    javascript 异常处理使用总结

    javascript 异常处理使用总结try…catch…finally [removed]

    Java 基础核心总结 +经典算法大全.rar

    try 、finally 、catch 什么是 Error 内部类 创建内部类集合 Iterable 接口顶层接口 ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 PriorityQueue HashMap TreeMap 类 LinkedHashMap 类 ...

    Java开发常见问题总结.docx

    一些关键且实用的Java开发技巧: ...使用finally块进行资源清理。 并发编程: 使用synchronized关键字或Lock接口进行同步控制。 利用ExecutorService进行多线程任务管理。 注意volatile关键字的使用,确保多线程

    java中的IO操作总结(四)

    java中的IO操作总结(四) 前面已经把java io的主要操作讲完了 这一节我们来说说关于java io的其他内容 Serializable序列化 实例1:对象的序列化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23...

    python基础内容大总结(精华免费版)

    内容主要分享作者在最初接触python时总结的python基础语法和知识点,适合0基础的人或者刚刚入行的小白进行阅读或查缺补漏,内容从最基础的输入输出语句、print打印、IF逻辑判断语句、elif逻辑判断语句、if和else的...

    java 编程入门思考

    1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...

    浅析Python中return和finally共同挖的坑

    最近在工作中遇到一个坑,发现这个坑居然存在于return和finally,所以觉着有必要总结分享一下,下面这篇文章主要介绍了关于Python中return和finally共同挖的坑,需要的朋友可以参考借鉴,下面来一起看看吧。

    java 面试题 总结

    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...

    Visual Basic 2010入门经典.part1.rar

    15.4 使用Try...Catch...Finally创建结构化错误处理程序 251 15.4.1 处理异常 253 15.4.2 处理预期的异常 254 15.5 总结 256 15.6 问与答 256 15.7 作业 257 15.7.1 测验 257 15.7.2 答案 257 15.7.3 练习 ...

    Visual Basic 2010入门经典.part2.rar

    15.4 使用Try...Catch...Finally创建结构化错误处理程序 251 15.4.1 处理异常 253 15.4.2 处理预期的异常 254 15.5 总结 256 15.6 问与答 256 15.7 作业 257 15.7.1 测验 257 15.7.2 答案 257 15.7.3 练习 ...

    Python读写文件方法总结

    本文实例总结了Python读写文件方法。分享给大家供大家参考。具体分析如下: 1.open 使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。 file_object = open...

    Lock总结.doc

    java多线程之lock。 Lock的基本用法如下,为了防止异常退出时没有释放锁,一般都在拿到锁后立马try,try住所有临界区的代码,然后finally释放锁。

    关于六级作文,自己总结的哦

    自己总结的写六级作文的哦。 It doesn't seem ugly to me; on the contrary, I think it's rather beautiful. To start with,...Besides,...Finally.... To begin with,....What's more, ...Last but not least ...

    Java面试题解惑系列

    4、final,finally,finalize;5.传了值还是传了引用;6.String杂谈;7.日期与时间的处理;8.基本类型总结;9.继承,多态,重载,重写;10.多线程;11.运算符总结。 适合将要笔试面试Java的朋友参考。

Global site tag (gtag.js) - Google Analytics