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失效。

  • 相关阅读:
    暑期测试训练3
    对于在线段树上修改整段区间的理解
    UVA 11090 判负圈问题
    ZOJ 2588 求割边问题
    POJ 1523 网络连通
    hdu 1163
    hdu 1703
    hdu 2577 模拟
    hdu 3836 强连通+缩点:加边构强连通
    hdu 2571
  • 原文地址:https://www.cnblogs.com/xiaoxiao1120/p/14866692.html
Copyright © 2011-2022 走看看