zoukankan      html  css  js  c++  java
  • java中异常处理finally和return语句的执行顺序

    1. finally代码块的语句在return之前一定会得到执行
    2. 如果try块中有return语句,finally代码块没有return语句,那么try块中的return语句在返回之前会先将要返回的值保存,之后执行finally代码块,最后将保存的返回值返回,finally代码块虽然对返回值进行修改也不影响返回值,因为要返回的值在执行finally代码块之前已经保存了,最终返回的是保存的旧值(值传递)。
    3. 如果try块和finally块都有返回语句,那么虽然try块中返回值在执行finally代码块之前被保存了,但是最终执行的是finally代码块的return语句,try块中的return语句不再执行。
    4. catch块和try块类似,会在执行finally代码块执行前保存返回值的结果,finally语句中有return语句则执行finally的return语句,没有则执行catch块中的return语句,返回之前的保存值。

    eg1:

     1 public class Num {
     2     public int x;
     3 }
     4 public class Test{
     5     static Num num = new Num();//num.x=0(默认)
     6     public static void main(String[] args) {
     7         System.out.println(new Test().test().x);//此处打印结果为2
     8         System.out.println(new Test().test1());//此处打印结果为1
     9     }
    10     static Num test(){
    11         num.x=1;//num.x=1;
    12         try {
    13             return num;//先将num保存起来,finally块执行完后,再将其返回,由于num为引用类型,即此处保存为地址,引用传递改变对象本身;
    14                         //而值传递实际是传递副本,改变的只是副本,而与此处保存的值无关,
    15                         //因此待finally执行完后返回值不会受到影响
    16         } finally{
    17             ++num.x;//num.x=2,此处修改调用的是num本身,因此num.x发生改变(引用传递)
    18         }
    19     }
    20     static int test1(){
    21         num.x=1;//num.x=1;
    22         try {
    23             return num.x;//值传递实际是传递副本,改变的只是副本,而与此处保存的值无关,
    24                         //因此待finally执行完后返回值不会受到影响    
    25         } finally{
    26             ++num.x;//num.x=2,此处修改是num.x的副本,因此num.x本身并没有改变(值传递)
    27         }
    28     }
    29 }
     
  • 相关阅读:
    Fragment中获取Activity的Context (转)
    raw cannot be resolved or is not a field解决办法
    商业分析07_06分布情况分析
    商业分析07_04漏斗分析
    商业分析07_03数据涨跌异动如何处理
    商业分析07_02多维度拆解
    商业分析07_01对比分析
    商业分析07_00概述 数据分析
    商业分析06选择数据工具
    商业分析05如何选取数据指标
  • 原文地址:https://www.cnblogs.com/FrankLei/p/6264972.html
Copyright © 2011-2022 走看看