用几个小问题整理一下try-catch-finally块的执行规则

学习Java的时候遇到了许多关于try-catch-finally块执行规则的问题,在这里简单整理一下,可能还会继续补充。
问题1

public class Test {
 public static void main(String[] args) {
     System.out.println("return value of getValue(): " + getValue());
 }
 public static int getValue() {
     int i = 1;
     try {
         i = 4;
     } finally{
         i++;
         return i;
     }
     }
 }

i首先被赋值为1,然后try里面的语句没有异常直接执行,i赋值为4,然后执行finally中的语句,最后返回结果为5。
问题2

package Test;
public class Test {
    private static void test(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            try {
                if (arr[i] % 2 == 0) {
                    throw new NullPointerException();
                } else {
                    System.out.print(i);
                }
            } finally {
                System.out.print("e");
            }
        }
    }

    public static void main(String[]args) {
        try {
            test(new int[] {0, 1, 2, 3, 4, 5});
        } catch (Exception e) {
            System.out.print("E");
        }
    }

}

因为arr[0] =0,所以test方法的try语句块里面会抛出一个异常NullPointerException,接着会执行finally中的语句,输出一个e,然后回到 main方法中,try语句块中捕捉到异常,所以执行catch语句块中的语句,输出一个E,最终运行结果为eE。
问题3

public class ZeroTest {
    public static void main(String[] args) {
     try{
       int i = 100 / 0;
       System.out.print(i);
  }catch(Exception e){
       System.out.print(1);
       throw new RuntimeException();
  }finally{
       System.out.print(2);
  }
      System.out.print(3);
 }
 }

执行try中的第一条语句int i = 100 / 0会抛出一个异常,然后执行catch中的语句,输出一个1,之后又抛出了一个新的异常RuntimeException。这个程序中没有对这个异常的处理,因此继续执行finally中的语句输出一个2以后程序便终止,不会在执行最后一条语句输出3,因此运行结果为12。
在这里插入图片描述
而如果在catch中不抛出这个异常,程序正常运行,输出123。在这里插入图片描述
问题4

package algorithms.com.guan.javajicu;
public class TestDemo
{
    public static String output = ””;
    public static void foo(int i)
    {
        try
        {
            if (i == 1)
            {
                throw new Exception();
            }
        }
        catch (Exception e)
        {
            output +=2;
            return ;
        } finally
        {
            output +=3;
        }
        output +=4;
    }
    public static void main(String[] args)
    {
        foo(0);
        foo(1);
        System.out.println(output);
    }
}

i=0时,不满足try语句块中的if语句,直接执行finally语句块,输出3,然后正常运行foo方法的最后一条语句,输出变为34。i=1时,try语句块中抛出一个异常,然后执行catch语句块,输出变为342,然后因为finally语句块的执行是在方法返回之前的,所以接着会执行finally语句块的内容,输出变为3423,然后再return。因此最终运行结果为3423。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值