首页 文章

在java中的try-catch块之后使用“finally”有什么好处? [关闭]

提问于
浏览
39

当try-catch结束时,总是执行“finally”块,无论是否异常 . 但是,try-catch之外和之后的每一行代码总是被执行 . 那么,我为什么要使用finally语句呢?

例:

try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    System.out.println("This line is always printed");
}
System.out.println("Also this line is always printed !! So why to use 'finally'?? ");

6 回答

  • 22

    最有用的情况是需要释放一些资源时:

    InputStream is = ...
    try {
        //code...
    } catch (Exception e) {
        //code...
    } finally {
        is.close();
    }
    

    更一般地说,即使在执行期间发生异常,您也希望确保代码在最后执行时使用它:

    long startTime = System.currentTimeMillis();
    try {
        //code...
    } catch (Exception e) {
        //code...
    } finally {
        long endTime = System.currentTimeMillis();
        System.out.println("Operation took " + (endTime-startTime) + " ms");
    }
    

    这个 finallyalways 被执行的想法是整个块之后的第一行不是这种情况

    • 如果 catch 块允许一些可抛出的传球

    • 如果它重新抛出一个异常,这是非常频繁的

  • -2

    如果try块中抛出的异常被catch块实际捕获并且执行没有被例如中断,则只运行最后一个 System.out.println (在finally块之后) . 退货声明 .

    在您的示例中,finally块将始终运行,但是如果在try块中没有抛出 Error (它不会被捕获),则执行将仅继续通过finally块,如果在catch块中没有抛出 Throwable 并且那里没有其他声明会中断执行 .

  • 4

    但是,try-catch之外和之后的每一行代码总是被执行

    这是不正确的 . 如果未经检查的异常(RuntimeException,Error及其子类), finally 之后的代码将无法执行 .

    看看这段代码

    public static void main(String[] args) {
        try{
            someDengerousMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            System.out.println("finally block");
        }
        System.out.println("after finally...");
    }
    public static void someDengerousMethod(){
        throw new Error("something went wrong");
    }
    
  • 0

    finally块是防止资源泄漏的关键工具 . 关闭文件或以其他方式恢复资源时,将代码放在finally块中以确保始终恢复资源 . 但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码 . 将清理代码放在finally块中始终是一种很好的做法,即使没有预期的例外情况也是如此 .

    更多here

  • -1

    假设您正在写入文件并突然创建了一个例外,您将如何关闭文件 . 然后最终帮助您以及数据库事务最终阻止帮助很多

  • 6

    finally块的唯一目的是 close the resources 你已经在try块中打开了 . 资源可以是数据库连接,文件写入/读取等:

    Connection conn= null;
    try {
     conn= get the db conn;
    //do some DML/DDL
    }
    catch(SQLException ex) {
    
    }
    finally {
    conn.close();
    }
    

相关问题