zoukankan      html  css  js  c++  java
  • JAVA中try、catch、finally带return的执行顺序总结

    1.try中带return:

    1. privateint testReturn1(){
    2. int i =1;
    3. try{
    4. i++;
    5. System.out.println("try:"+ i);
    6. return i;
    7. }catch(Exception e){
    8. i++;
    9. System.out.println("catch:"+ i);
    10. }finally{
    11. i++;
    12. System.out.println("finally:"+ i);
    13. }
    14. System.out.println("last:"+ i);
    15. return i;
    16. }
    执行结果为:
    try:2
    finally:3
    调用方法后返回值:2
    2.
    1. privateList<Integer> testReturn2(){
    2. List<Integer> list =newArrayList<>();
    3. try{
    4. list.add(1);
    5. System.out.println("try:"+ list);
    6. return list;
    7. }catch(Exception e){
    8. list.add(2);
    9. System.out.println("catch:"+ list);
    10. }finally{
    11. list.add(3);
    12. System.out.println("finally:"+ list);
    13. }
    14. System.out.println("last:"+ list);
    15. return list;
    16. }
    try:[1]
    finally:[1, 3]
    调用方法后的执行结果:[1, 3]
    看完这个例子,可能会发现问题,刚提到return时会临时保存需要返回的信息,不受finally中的影响,为什么这里会有变化?其实问题出在参数类型上,上一个例子用的是基本类型,这里用的引用类型。list里存的不是变量本身,而是变量的地址,所以当finally通过地址改变了变量,还是会影响方法返回值的。
    3.catch中带有return
    1. privateint testReturn3(){
    2. int i =1;
    3. try{
    4. i++;
    5. System.out.println("try:"+ i);
    6. int x = i /0;
    7. }catch(Exception e){
    8. i++;
    9. System.out.println("catch:"+ i);
    10. return i;
    11. }finally{
    12. i++;
    13. System.out.println("finally:"+ i);
    14. }
    15. return i;
    16. }
    try:2
    catch:3
    finally:4
    调用方法后的返回值:3
    catch中return与try中一样,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。所以,这里方法返回的值是try、catch中累积计算后的3,而非finally中计算后的4。
    4.finally中带有return
    1. privateint testReturn4(){
    2. int i =1;
    3. try{
    4. i++;
    5. System.out.println("try:"+ i);
    6. return i;
    7. }catch(Exception e){
    8. i++;
    9. System.out.println("catch:"+ i);
    10. return i;
    11. }finally{
    12. i++;
    13. System.out.println("finally:"+ i);
    14. return i;
    15. }
    16. }
    try:2
    finally:3
    调用方法返回值:3

    总结:

    1、finally中的代码总会被执行。

    2、当try、catch中有return时,也会执行finally。return的时候,要注意返回值的类型,是否受到finally中代码的影响。

    3、finally中有return时,会直接在finally中退出,导致try、catch中的return失效。

    1.

    1. privateint testReturn1(){
    2. int i =1;
    3. try{
    4. i++;
    5. System.out.println("try:"+ i);
    6. return i;
    7. }catch(Exception e){
    8. i++;
    9. System.out.println("catch:"+ i);
    10. }finally{
    11. i++;
    12. System.out.println("finally:"+ i);
    13. }
    14. System.out.println("try:"+ i);
    15. return i;
    16. }
    执行结果为:
    try:2
    finally:3
    调用方法后返回值:2
    2.
    1. privateList<Integer> testReturn2(){
    2. List<Integer> list =newArrayList<>();
    3. try{
    4. list.add(1);
    5. System.out.println("try:"+ list);
    6. return list;
    7. }catch(Exception e){
    8. list.add(2);
    9. System.out.println("catch:"+ list);
    10. }finally{
    11. list.add(3);
    12. System.out.println("finally:"+ list);
    13. }
    14. System.out.println("last:"+ list);
    15. return list;
    16. }
    try:[1]
    finally:[1, 3]
    调用方法后的执行结果:[1, 3]
    看完这个例子,可能会发现问题,刚提到return时会临时保存需要返回的信息,不受finally中的影响,为什么这里会有变化?其实问题出在参数类型上,上一个例子用的是基本类型,这里用的引用类型。list里存的不是变量本身,而是变量的地址,所以当finally通过地址改变了变量,还是会影响方法返回值的。
    3.catch中带有return
    1. privateint testReturn3(){
    2. int i =1;
    3. try{
    4. i++;
    5. System.out.println("try:"+ i);
    6. int x = i /0;
    7. }catch(Exception e){
    8. i++;
    9. System.out.println("catch:"+ i);
    10. return i;
    11. }finally{
    12. i++;
    13. System.out.println("finally:"+ i);
    14. }
    15. return i;
    16. }
    try:2
    catch:3
    finally:4
    调用方法后的返回值:3
    catch中return与try中一样,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。所以,这里方法返回的值是try、catch中累积计算后的3,而非finally中计算后的4。
    4.finally中带有return
    1. privateint testReturn4(){
    2. int i =1;
    3. try{
    4. i++;
    5. System.out.println("try:"+ i);
    6. return i;
    7. }catch(Exception e){
    8. i++;
    9. System.out.println("catch:"+ i);
    10. return i;
    11. }finally{
    12. i++;
    13. System.out.println("finally:"+ i);
    14. return i;
    15. }
    16. }
    try:2
    finally:3
    调用方法返回值:3

    总结:

    1、finally中的代码总会被执行。

    2、当try、catch中有return时,也会执行finally。return的时候,要注意返回值的类型,是否受到finally中代码的影响。

    3、finally中有return时,会直接在finally中退出,导致try、catch中的return失效。

  • 相关阅读:
    分享上大学时CCTV5经常播放的一段宣传片
    嗯, 在Vista下面post一篇, 快过年的二三事
    [转自天涯]很多年以前,我是一个中锋
    关于Anthem的Button控件, 为啥仍然会PostBack?
    小白三下杭州
    搜狗, 谷歌, 紫光, 3大输入法互打结果.
    2008春节回家流水账
    早上拍的雪景.
    如果安装.net framework 3.5出错, 可以这样解决
    我那幸福的坐车偶记...
  • 原文地址:https://www.cnblogs.com/xiaoxiao1120/p/14866692.html
Copyright © 2011-2022 走看看