Try{}catch(){}finally{}语句中含有return语句如何执行

本文详细分析了Java中try-catch-finally语句块内return语句的执行逻辑。总结了五种不同情况下的执行结果,包括正常返回、异常处理返回、finally块内return覆盖、基本数据类型返回值变化以及引用数据类型返回值变化。讨论了finally块的执行保证以及return语句的优先级问题。
摘要由CSDN通过智能技术生成

Try{}catch(){}finally{}语句中含有return语句如何执行

这里分多种情况:

  • 情况1:
    try{}中含有return,并且try{}中没有异常,且finally{}中没有return。
 public String exceptionTest(){
        System.out.println("程序开始执行啦");
        try{
            int[] arrays = {1,2};
            return "try执行完毕";  //实现约定好的返回值
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界异常");
        }catch(NullPointerException e){
            System.out.println("空指针异常");
        }finally {
            System.out.println("执行了finally块");
        }
        return "执行到了最后";
    }

执行结果:

总结1:
如果在try中就含有return且含有finally块,程序先将try中return的结果保留,执行完finally块,最后返回try中return的值

  • 情况2:
    try{}中含有return,并且try{}中有异常,且finally{}中没有return。
 public String exceptionTest(){
        System.out.println("程序开始执行啦");
        try{
            int[] arrays = {1,2};
            System.out.println(arrays[10]); //制造一个数组越界异常
            return "try执行完毕";  //实现约定好的返回值
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界异常");
        }catch(NullPointerException e){
            System.out.println("空指针异常");
        }finally {
            System.out.println("执行了finally块");
        }
        return "执行到了最后";
    }

执行结果:

总结2:
如果try语句中的最后含有return语句且前面有异常,程序会执行异常中catch语句,然后到finally块,不会往下执行try语句,所以最终执行的return是整个方法最后的return

  • 情况3:
    try{}中含有return,并且try{}中没异常,且finally{}中有return。
    public String exceptionTest(){
        System.out.println("程序开始执行啦");
        try{
            int[] arrays = {1,2};
            return "try执行完毕";  //实现约定好的返回值
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界异常");
        }catch(NullPointerException e){
            System.out.println("空指针异常");
        }finally {
            System.out.println("执行了finally块");
            return "执行了finally中的return";
        }
    }

执行结果:
在这里插入图片描述
总结3:
finally中的语句一定会执行,finally中有return就执行finally中的

  • 情况4:
    return中返回值类型是基本数据类型,且finally{}中改变了变量的值。
    public int exceptionTest(){
        System.out.println("程序开始执行啦");
        int i = 10;
        try{
            int[] arrays = {1,2};
            return i;  //实现约定好的返回值
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界异常");
        }catch(NullPointerException e){
            System.out.println("空指针异常");
        }finally {
            i += 10;
            System.out.println("执行了finally块");
        }
        return i;
    }

执行结果:

总结4
尽管finally块中改变了返回值 i,但因为finally中没有return该i的值,因此在执行完finally中的语句后返回的还是原来 i=10 的值,如果return在finally里面则返回 i = 20

  • 情况5:
    return中返回值类型是引用数据类型,且finally{}中改变了改引用数据类型的值。
public class ExceptionTest {

    public int[] exceptionTest(){
        System.out.println("程序开始执行啦");
        int[] arrays = {1,2};
        try{
            return arrays;  //实现约定好的返回值
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界异常");
        }catch(NullPointerException e){
            System.out.println("空指针异常");
        }finally {
            arrays[0] = 10;
            System.out.println("执行了finally块");
        }
        return arrays;
    }

    public static void main(String[] args){
        ExceptionTest test = new ExceptionTest();
        int[] array = test.exceptionTest();  //接收返回值
        //循环遍历返回值数组
        for (int num : array) {
            System.out.println(num);
        }
    }
}

执行结果:

总结5
因为finally中改变的是引用数据类型,所以整个类型里的值都会改变。这里的区别就是和形参实参的区别一样,我们用变量接收基本数据类型接收的是值,当方法结束,一切都烟消云散,归于原来的样子;但当变量接收的是引用数据类型的时候,存的是引用地址,我们对他操作就相当于通过地址找到了他本身,对本体操作,方法结束时,但样子已经不是原来的样子了。

注意:总之finally里含有return会把之前的return覆盖掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值