当finally和return同时出现执行的先后问题

1.try和catch中有return语句,finally里面的代码也会被执行。。
 
 2.应该避免finally中出现return语句:Eclipse会给出警告:"finally block does not complete normally"
         
 return的简要作用?
               A:返回一个结果,
               B:结束这个方法。

finally的简要作用?
   收尾工作:可能产生异常catch,也可能不产生异常try,有些必须要执行的代码--->finally
    断开连接,释放资源,删除临时文件。。。。

 

3.finally中尝试修改变量

验证观察如下的代码:

package finally和return的区别;

import java.util.Arrays;

public class Test {
	
        // 返回值为引用类型的数据类型
	public String[] fun1() {
		String[] arr = {"1号元素","2号元素","3号元素"};
		try {
			arr[0] += "--->经过try之后";
			return arr;
		} catch (Exception e) {
			return arr;
		} finally {
			arr[0] += "--->finally执行后";
		}
	}
	// 返回值为基本数据类型的常量
	public int fun2() {
		int i = 100;
		try {
			i++;
			return i;
		} catch (Exception e) {
			return i;
		} finally {
			i = i + 1;
		}
	}

        // 返回值为字符串常量
	public String fun3() {
		String str = "我是一个字符串常量";
		try {
			str += "经过try之后";
			return str;
		} catch (Exception e) {
			return str;
		} finally {
			str += "经过finally之后";
		}
	}


	public static void main(String[] args) {
		Test test = new Test();
		
		System.out.println(Arrays.toString(test.fun1())); 
                //[1号元素--->经过try之后--->finally执行后, 2号元素, 3号元素]

		System.out.println(test.fun2());//	101
		System.out.println(test.fun3());// 我是一个字符串常量经过try之后
	}
}

 

总结:

1、当 return的返回值为 引用类型的时候,经过finally之后,返回值的结果会发生改变。

2、当return的返回值为 基本数据类型或者字符串常量的时候,经过finally之后,返回值的结果不会发生改变。

3、其实Return执行的虽然在finally之前,但是return是没有执行结束的,而是在finally执行结束之后,return才会真正的执行结束。

4、至于为什么会产生哪两种结果,而是基本数据类型和字符串常量的地址,当值发生改变的时候,引用所指向的地址发生了改变。

5、而返回值为引用类型的时候,地址一直都没有发生改变,所以结果就会随着地址中的值改变而发生改变。

 

类似于下面的代码:

		String str1 = "123";
		System.out.println("修改之前的 hashCode值为:  "+str1.hashCode());
                 // 修改之前的 hashCode值为:  48690
		
		str1 = "1234";
		System.out.println("修改之后的 hashCode值为:  "+str1.hashCode()); 
                 //修改之后的 hashCode值为:  1509442
		
		Person p1 = new Person();
		p1.setName("之前名字");
		System.out.println("修改之前的 hashCode值为:  "+p1);
                 //修改之前的 hashCode值为:  finally和return的区别.Person@15db9742
		
		p1.setName("之后名字");
		System.out.println("修改之前的 hashCode值为:  "+p1);
                  //修改之前的 hashCode值为:  finally和return的区别.Person@15db9742

 

posted @ 2020-04-27 21:02  小熊猫陈江一  阅读(76)  评论(0编辑  收藏  举报