【问题标题】:Can I write same code Without finally block? [duplicate]我可以在没有 finally 块的情况下编写相同的代码吗? [复制]
【发布时间】:2018-09-10 11:49:50
【问题描述】:

我知道,即使发生异常,也总是会执行 finally 块。

如果我们在 try 或 catch 块中使用 System.exit(0) 它不会执行;

用于释放资源。

但我有疑问,catch 块之后的语句无论如何都会执行,即使这些语句没有 finally 编写,对吧?

请解释一下。

见下面代码sn-ps -

public static void main(String[] args) throws SQLException {

    Connection con=null;
    try {
        String url ="someURL";
        String user ="someUserName";
        String password ="somePassword";

        con=DriverManager.getConnection(url, user, password);
        .
        .
        .
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        if(con!=null) {
            con.close();
        }
    }

}

public static void main(String[] args) throws SQLException {

    Connection con=null;
    try {
        String url ="someURL";
        String user ="someUserName";
        String password ="somePassword";

        con=DriverManager.getConnection(url, user, password);
        .
        .
        .
    }catch(Exception e) {
        e.printStackTrace();
    } 

   if(con!=null) {
     con.close();
   }


}

所以我的con.close(); 无论如何都会执行,那为什么我需要finally?

【问题讨论】:

    标签: java


    【解决方案1】:

    在这种特殊情况下,我会说这确实是相同的,但是您是否考虑过 try with resource 以便 con 自动关闭?这将是我能想到的最干净的方式。

    当然,如果抛出不是Exception 的东西(例如Throwable),那么如果没有finally,您的连接就不会关闭...

    【讨论】:

    • 是的,使用try with resource 甚至con.close() 也不是必需的。
    • @NinadPingale 完全正确!这使代码更简洁、更好并且更不容易出错
    【解决方案2】:

    通常使用 catch 块捕获所有异常并不是最佳做法。在这种情况下,如果有任何没有抓住的东西被扔掉,finally 会有所帮助。而且,您的第二个代码 sn-p 将不起作用。

    【讨论】:

    • 如果发生异常,会被catch块捕获。并且 con.close 将始终执行。对吗?
    • 是的。但是用 catch(Exception e) 覆盖整个代码并不是一个好习惯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多