zoukankan      html  css  js  c++  java
  • 异常 try – finally 注意的地方

    finally

    异常机制中还有一个重要的部分,就是finally, catch后面可以跟finally语句,语法如下所示:

    复制代码
     
    try{
        //可能抛出异常
    }catch(Exception e){
        //捕获异常
    }finally{
        //不管有无异常都执行
    }
     
    复制代码

    finally内的代码不管有无异常发生,都会执行。具体来说:

    • 如果没有异常发生,在try内的代码执行结束后执行。
    • 如果有异常发生且被catch捕获,在catch内的代码执行结束后执行
    • 如果有异常发生但没被捕获,则在异常被抛给上层之前执行。

    由于finally的这个特点,它一般用于释放资源,如数据库连接、文件流等。

    try/catch/finally语法中,catch不是必需的,也就是可以只有try/finally,表示不捕获异常,异常自动向上传递,但finally中的代码在异常发生后也执行。

    finally语句有一个执行细节,如果在try或者catch语句内有return语句,则return语句在finally语句执行结束后才执行,但finally并不能改变返回值,我们来看下代码:

    复制代码
     
    public static int test(){
        int ret = 0;
        try{
            return ret;
        }finally{
            ret = 2;
        }
    }
     
    复制代码

    这个函数的返回值是0,而不是2,实际执行过程是,在执行到try内的return ret;语句前,会先将返回值ret保存在一个临时变量中,然后才执行finally语句,最后try再返回那个临时变量,finally中对ret的修改不会被返回。

    如果在finally中也有return语句呢?try和catch内的return会丢失,实际会返回finally中的返回值。finally中有return不仅会覆盖try和catch内的返回值,还会掩盖try和catch内的异常,就像异常没有发生一样,比如说:

    复制代码
     
    public static int test(){
        int ret = 0;
        try{
            int a = 5/0;
            return ret;
        }finally{
            return 2;
        }
    }
     
    复制代码

    以上代码中,5/0会触发ArithmeticException,但是finally中有return语句,这个方法就会返回2,而不再向上传递异常了。

    finally中不仅return语句会掩盖异常,如果finally中抛出了异常,则原异常就会被掩盖,看下面代码:

    复制代码
     
    public static void test(){
        try{
            int a = 5/0;
        }finally{
            throw new RuntimeException("hello");
        }
    }
     
    复制代码

    finally中抛出了RuntimeException,则原异常ArithmeticException就丢失了。

    所以,一般而言,为避免混淆,应该避免在finally中使用return语句或者抛出异常,如果调用的其他代码可能抛出异常,则应该捕获异常并进行处理。

  • 相关阅读:
    141. Linked List Cycle【easy】
    237. Delete Node in a Linked List【easy】
    234. Palindrome Linked List【easy】
    排序_归并排序
    排序_选择排序
    排序_快速排序
    排序_冒泡排序
    排序_希尔排序
    排序_插入排序
    121. Best Time to Buy and Sell Stock【easy】
  • 原文地址:https://www.cnblogs.com/gq0324/p/8862323.html
Copyright © 2011-2022 走看看