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

finally语句块知多少(一)

    博客分类:
  • Tips
J# 
阅读更多

问题重现

先来看一下以下的代码,猜猜他们会是什么样的结果:

public class FinallyIssue {
	public static void main(String[] args) {
		System.out.println("finallyReturnTest : ");
		System.out.println("return value : " + finallyReturnTest(1));
		System.out.println("return value : " + finallyReturnTest(-1));
		
		System.out.println("finallyBreakTest : ");
		System.out.println("return value : " + finallyBreakTest(true));
		System.out.println("return value : " + finallyBreakTest(false));
		
		System.out.println("valueChangeInFinallyTest : ");
		System.out.println("return value : " + valueChangeInFinallyTest());
		
		System.out.println("valueChangeReturnInFinallyTest : ");
		System.out.println("return value : " + valueChangeReturnInFinallyTest());
		
		System.out.println("refValueChangeInFinallyTest : ");
		System.out.println("return name : " + refValueChangeInFinallyTest().name);
	}
	
	private static boolean finallyReturnTest(int value) {
		try {
			if(value > 0) {
				return true;
			} else {
				return false;
			}
		} finally {
			return false;
		}
	}
	
	private static boolean finallyBreakTest(boolean value) {
		while(value) {
			try {
				return true;
			} finally {
				break;
			}
		}
		return false;
	}
	
	private static int valueChangeInFinallyTest() {
		int i = 10;
		int j = 1;
		try {
			i = 100;
			j = 2;
			System.out.println("try : i = " + i);
			System.out.println("try : j = " + j);
			return i;
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			i = 1000;
			j = 3;
			System.out.println("finally : i = " + i);
			System.out.println("finally : j = " + j);
		}
		
		return i;
	}
	
	private static int valueChangeReturnInFinallyTest() {
		int i = 10;
		int j = 1;
		try {
			i = 100;
			j = 2;
			System.out.println("try : i = " + i);
			System.out.println("try : j = " + j);
			return i;
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			i = 1000;
			j = 3;
			System.out.println("finally : i = " + i);
			System.out.println("finally : j = " + j);
			return i;
		}
	}
	
	private static Person refValueChangeInFinallyTest() {
		Person p = new Person();
		try {
			p.name = "person1";
			System.out.println("try : Person name is : " + p.name);
			return p;
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			p.name = "person2";
			System.out.println("finally : Person name is : " + p.name);
		}
		
		p.name = "person3";
		System.out.println("out : Person name is : " + p.name);
		
		return p;
	}
	
	static class Person {
		public String name;
	}
}

 

这样一段代码的结果会是什么呢?

以下是运行结果:

finallyReturnTest :

return value : false

return value : false

finallyBreakTest :

return value : false

return value : false

valueChangeInFinallyTest :

try : i = 100

try : j = 2

finally : i = 1000

finally : j = 3

return value : 100

valueChangeReturnInFinallyTest :

try : i = 100

try : j = 2

finally : i = 1000

finally : j = 3

return value : 1000

refValueChangeInFinallyTest :

try : Person name is : person1

finally : Person name is : person2

return name : person2

 

这个结果很出乎我的意料,我们知道finally总是会在try-catch语句块执行完后执行,不管try语句块中是否已经返回或者抛出了异常。

 

但是在上面的代码测试中,如果finally语句块中有returnbreakcontinue等语句,那么它们会覆盖try语句块中的returnbreakcontinue的语句,如以上的finallyReturnTest()finallyBreakTest()valueChangeReturnInFinallyTest()三个函数。

另外,如果在finally语句块中修改要返回的值类型变量的值,则这些修改不会保存下来,如valueChangeInFinallyTest()函数;如果要返回的值是引用类型,则修改引用类型的内部成员的值会保存下来。

如何解释这个结果呢?

 

结果解释在下一篇中给出。javaeye中发表长一点的文章实在是太差了,不是word贴出来有问题,就是随便给你截断了,郁闷!!

 

0
0
分享到:
评论

相关推荐

    浅谈Java自定义异常在教学中的教与学

    经过教学实践发现,学生对于异常的掌握通常停留在使用try-catch-finally语句捕获异常的水平上,对于异常内部机制及自定义异常的了解较少。这种情况往往导致学生在实际编程中对异常处理的应用不够灵活,对自定义异常...

    Java基础学习/高级类/异常处理/线程

    Java使用try-catch-finally语句块来捕获和处理异常。try块中包含可能会抛出异常的代码,catch块用来捕获并处理特定类型的异常,finally块确保无论是否发生异常,某些代码(如资源释放)总能得到执行。通过使用异常...

    C#小知識點

    9. **错误处理**:.NET使用try-catch-finally语句块处理异常。`try`块中捕获异常,`catch`块处理异常,`finally`块确保即使发生异常也能执行的清理代码。 10. **using关键字**:用于确保资源在使用后得到正确释放,...

    整理了一个关于网上java问与答的一个手册

    1. 异常概述:介绍Java异常处理机制,包括异常类层次结构和try-catch-finally语句块的使用。 2. 自定义异常:讲解如何创建自定义异常类以及何时使用它们。 四、集合框架 1. 数组列表(ArrayList)与链表...

    Java核心技术 卷1 基础知识 原书第10版 ,凯 S.霍斯特曼

    3. **异常处理**:Java有强大的异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,提高程序的健壮性。 4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet、HashMap等,它们提供了...

    java-basic-knowledge.zip_Knowledge

    4. **异常处理**:Java提供了一种强大的异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。理解何时抛出异常,如何编写自定义异常,以及如何有效地使用异常处理,是编写健壮Java代码的必要技能。 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    10.4.1 多态——运行方知结果 280 10.4.2 重载也不简单 280 10.4.3 使用多态构建车队 283 10.5 在多态的环境中拨开迷雾 284 10.5.1 神秘的Class类 284 10.5.2 覆盖不再神秘 285 10.5.3 instanceof运算符——让...

    JAVA核心知识点整理——java自学资料.rar

    4. **异常处理**:理解如何使用try-catch-finally语句块,以及不同类型的异常类,有助于编写健壮的代码。 5. **IO流与NIO**:输入输出流的理解和使用,包括文件操作、网络通信等,以及Java NIO(非阻塞I/O)的概念...

    Java夜未眠.程序员的心声.rar

    通过try-catch-finally语句块,程序员可以捕获并处理运行时可能出现的错误,确保程序的正常运行。 3. **集合框架**:Java集合框架是存储和管理对象的重要工具,包括List、Set、Queue和Map接口,以及ArrayList、...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    10.4.1 多态——运行方知结果 280 10.4.2 重载也不简单 280 10.4.3 使用多态构建车队 283 10.5 在多态的环境中拨开迷雾 284 10.5.1 神秘的Class类 284 10.5.2 覆盖不再神秘 285 10.5.3 instanceof运算符——让...

    举例介绍Python中的25个隐藏特性

    Python的异常处理语句提供了else块和finally块,它们在异常处理中有特定的用途。 ```python try: put_***_volts_through_it(parrot) except Voom: print("'E'spining!") else: print("This parrot is no more!")...

    通过这篇总结实现找工作自由! 《Java面试必知必系列-V1.0》靠谱

    - 使用`try-catch-finally`语句块捕获和处理异常。 - 熟悉`Exception`类层次结构,了解常见异常类。 5. **集合框架** - 理解ArrayList、LinkedList、HashSet、HashMap等容器的内部原理和使用场景。 - 掌握List...

    c#学习笔记.txt

    lock 关键字将某个语句块标记为临界区。 6. 方法参数 如果为没有 ref 或 out 的方法声明一个参数,则此参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数...

    C#指南msdn文档,初学者必备

    在C#中,可以使用try、catch和finally语句处理运行时的错误,提高程序的健壮性。 编码风格和约定: C#具有明确的编码风格和约定,比如变量命名规则、使用匿名类型以及对编译器生成的异常的处理。遵循一致的编码标准...

    JAVA语言的基本语法PPT教案学习.pptx

    例如,`abstract`用于声明抽象类,`const`虽然在Java中未被使用,但在其他语言中表示常量,`finally`确保代码块无论如何都会执行,`int`是基本数据类型之一,代表整数。`this`引用当前对象,`throw`用于抛出异常,`...

    Java 课程实例与实训代码

    3. **异常处理**: Java 异常处理是程序健壮性的重要组成部分,涉及到try-catch-finally块和异常类的使用。实训代码会展示如何正确捕获和处理运行时错误,确保程序在遇到问题时能有优雅的退出方式。 4. **集合框架**...

Global site tag (gtag.js) - Google Analytics