【面试加分项】java异常处理之try_catch_finally

try_catch_finally大家应该用的很多,不少人也了解一些他们的执行顺序,可是它真的有这么简单么,下面我们先来看一段代码,大家想想他的执行结果是什么?

public class TestException {  
    int goabl=1;
    public TestException() {  
    }  

    int testEx() throws Exception {  
        int ret = 1;  
        try {  
            ret++; 
            return ret;
        } catch (Exception e) {  
           ret++;
           return ret;
        } finally {  
           ret=0;         
        }  
    }  

    int testEx1() throws Exception {  
         int ret = 1;  
         try {  
             ret++; 
             int t=ret/(ret-2);//制造一个exception
             return ret;
         } catch (Exception e) {  
            ret++;
            return ret;
         } finally {  
            ret=0;         
         }  
    }  

    int testEx2() throws Exception {  
        int ret = 1;  
        try {  
            ret++; 
            int t=ret/(ret-2);//制造一个exception
            return ret;
        } catch (Exception e) {  
           ret++;
           return ret;
        } finally {  
           ret=0;
           return ret;
        }  
    }  
    int testEx3() throws Exception {  
        int ret = 1;  
        try {  
            ret++; 
            return ret;
        } catch (Exception e) {  
           ret++;
           return ret;
        } finally {  
           ret=0;
           return ret;
        }  
    }  
    int testEx4() throws Exception {  
        try {  
            goabl++; 
            return goabl;
        } catch (Exception e) {  
            goabl++;
           return goabl;
        } finally {  
            goabl=0;

        }  
    }  

    public static void main(String[] args) {  
        TestException testException1 = new TestException();  
        try {  
            System.out.println(testException1.testEx());
            System.out.println(testException1.testEx1());
            System.out.println(testException1.testEx2());
            System.out.println(testException1.testEx3());
            System.out.println(testException1.testEx4());
            System.out.println(goabl);
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

好了现在公布答案:
2
3
0
0
2
0
如果你的答案是正确的且知道是为什么,那么下面的内容相信你也不用看了。
首先这里我就不细说java的异常处理机制,想了解的同学可以去看看java异常处理深入研究
我们首先对try_catch_finally的执行顺序进行说明。
首先我可以很明确的告诉大家try_catch_finally的执行顺序其实很简单,首先是执行try中的 语句如果有异常就直接进入catch,最后finally一定会执行。
这样可能有人会问那为什么第一个的输出不是0呢?别急我们来一个一个说明。

testEx

try语句中没有任何异常所以catch不会执行。ret进行了一次++操作,这时程序进行了返回,在内存中会生成一个临时变量,来保存ret,也就是说ret的值赋给了一个临时变量所以,ret在finally中赋值为零并不会改变返回的值所以输出为2;

testEx1

这次我们人为的在try的语句中制造了exception这样程序会进入到catch中,所以ret被++两次,同样finally中的语句不能对返回值产生影响,所以输出为3;

testEx2

相对于testEx1我们在finally语句中加入了return语句,说以函数的返回值变成了0,这样说名我能函数的返回值实在finally执行结束后才确定的。

testEx3

同testEx2一样由于finally中加入了return语句,返回值为0;

testEx4

在这个函数中我们把操作的对象改为了全局变量,结合最后一个输出我们可以知道函数的返回结果的确是被一个临时变量接收了,所以函数返回的结果是2,但是goabl已经变为0了。

好了这次就到这,觉得不错的同学就帮我在下面点个赞呗,就在博客的下方,点一下那个顶子就好,谢谢啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值