`

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-finally语句是Java语言中一种常用的异常处理机制,当程序在执行过程中出现异常时,可以使用try-catch-finally语句来捕获和处理异常。下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try...

    finally结构的注意点(一)

    总结一下,`finally` 结构是Java编程中处理异常和确保关键操作执行的重要工具。正确理解其工作原理和使用限制,可以帮助开发者编写更加稳定和高效的代码。在进行异常处理和资源管理时,一定要充分利用 `finally` 的...

    final, finally, finalize的区别

    `finally` 块是异常处理机制的一部分,通常与 `try` 和 `catch` 结合使用。它的主要功能是在 `try` 块中抛出异常后,无论是否捕获到异常,`finally` 块中的代码都会被执行。这意味着即使在程序中发生未被捕获的异常...

    java面试题 谈谈final, finally, finalize的区别

    总结,`final` 关键字保证了变量、方法和类的不可变性;`finally` 确保了代码块的执行,尤其是在异常处理中;而 `finalize` 则是一个与垃圾回收相关的特殊方法,虽然不推荐直接使用,但在特定场景下可以帮助清理资源...

    finally分析

    在这个语法结构中,不论`__try`块中的代码如何退出,`__finally`块中的代码都将被执行,除非使用了`ExitProcess`, `ExitThread`, `TerminateProcess`或`TerminateThread`这些会直接导致进程或线程终止的函数。...

    3谈谈final、finally、finaliz1

    总结来说,final、finally和finalize在Java中分别扮演着不同的角色。final用于增强代码的语义清晰度和安全性,finally保证了资源清理的可靠性,而finalize则是尝试提供对象销毁前的清理机会,但由于其缺陷已被逐渐弃...

    java try…catch…finally捕获异常的实例

    总结来说,`try-catch-finally`结构是Java中处理异常的关键工具,它允许开发者优雅地处理错误,保持程序的健壮性,同时确保必要的清理工作得以执行。通过正确使用这些结构,可以提高代码的可读性和可维护性。

    java中final与finally的使用介绍

    - `finally` 通常与 `try-catch` 结构一起使用,用于提供一种确保某些代码无论是否发生异常都将被执行的机制。`finally` 块中的代码是必不可少的,特别是在处理资源关闭(如文件流、数据库连接等)时,以确保资源...

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

    Java中finally和return的关系实例解析的知识点可以总结为以下几点: 1. finally语句是在try的return语句执行之后,return返回之前执行的。 2. 如果在try块中执行了System.exit(0)语句,finally语句将不会被执行。 3...

    详解Java编程中final,finalize,finally的区别

    总结起来,`final`用于声明不变量、方法和类,保证其不可变性或不可扩展性;`finalize`是为了在对象被回收前执行清理工作,但使用需谨慎;而`finally`则是异常处理的关键,确保了关键代码段的执行,特别是在资源管理...

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

    总结来说,`finally`语句在Java异常处理中扮演着清理角色,它确保了关键代码的执行,尤其是在异常发生时。然而,其执行依赖于`try`块的正常执行,且受到`return`、`System.exit()`、线程中断或程序异常终止等因素的...

    delphi经验总结delphi总结

    Delphi是一种强大的面向对象的编程环境,...不断学习和总结Delphi的使用经验,能够帮助我们更好地驾驭这一平台,编写出高质量的桌面应用。通过实践和探索,你可以发现更多隐藏在Delphi中的宝藏,提升自己的编程技能。

    try-catch-finally执行顺序验证

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

    C2Python_Lesson2_finally.zip

    10. **总结和进阶**:可能还包含了对整个过程的总结,以及如何进一步学习和应用这些技术,比如自定义数据类型、封装C++类等高级主题。 总之,这个教程可能涵盖了从基础到进阶的C/C++与Python互操作知识,包括ctypes...

    Powershell中Finally语句用法示例

    总结一下,Powershell的`Finally`语句是保证关键操作执行的重要工具,尤其是在涉及资源管理、清理工作或者需要在任何情况下都需要执行的代码片段时。它与`try...catch`配合使用,能够提升脚本的健壮性,确保程序在...

    大数据实训知识点总结.pdf

    大数据实训知识点总结 大数据实训知识点总结是对大数据实训的总结,涵盖了Python语言的基础知识点、数据类型、控制结构、函数、对象、异常处理、文件输入输出、模块和包、数据分析和可视化等方面的知识点。 一、...

    finally 一定会执行(实例代码)

    在Java编程语言中,`finally`块是一个非常重要的概念,它与`try`和`catch`块一起用于处理异常情况。`finally`块确保无论是否发生...在编写涉及异常处理的Java代码时,正确使用`finally`块对于程序的健壮性至关重要。

    简单谈谈java中final,finally,finalize的区别

    总结起来,`final`用于声明不变性,`finally`保证代码块的执行,而`finalize`是对象被垃圾收集前的最后清理机会。了解这些概念对于编写健壮、可维护的Java代码至关重要。在实际编程中,应谨慎使用`finalize`,更多地...

    网站优化方法总结

    finally { Conn.Close(); } } ``` 此模式确保了数据库连接在使用完毕后被及时关闭并归还给连接池,避免了资源泄漏。 #### 预编译查询(Precompiled Queries) 预编译查询是一种将SQL语句编译为二进制格式存储...

    谈谈Java中try-catch-finally中的return语句

    总结一下,`try-catch-finally`结构中的`return`语句遵循以下规则: 1. 如果`finally`块没有`return`语句,那么`try`块中的`return`会决定返回值。 2. 如果`finally`块有`return`语句,无论`try`块是否包含`return`...

Global site tag (gtag.js) - Google Analytics