zoukankan      html  css  js  c++  java
  • 当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
  • 相关阅读:
    程序结束时执行
    Flex动画效果
    Flex_As操作大全
    bat文件格式
    flex builder 1037:包不能嵌套
    JAVA延时
    RMAN备份详解2
    linux系统监控示例:vmstat
    RMAN还原与恢复2(RMAN Incomplete Recovery)
    Oracle有效地使用块(1)
  • 原文地址:https://www.cnblogs.com/HW-CJY/p/13751686.html
Copyright © 2011-2022 走看看