Java中try-catch-finally语句的执行顺序

自从用了Druid作为数据库的连接池再也没有自己手写过JDBC了,在JDBC代码中有一个地方很重要,那就是连接的关闭。这里将try-catch-finally语法的执行顺序做一个总结,方便忘记时过来回顾。

JDBC中连接的正确关闭方式

import java.sql.*;  
class OracleCon{  
public static void main(String args[]){  

        ResultSet rs = null;
        Connection con = null;
        Statement stmt = null;
try{  
//step1 load the driver class  
Class.forName("oracle.jdbc.driver.OracleDriver");  

//step2 create  the connection object  
 con=DriverManager.getConnection(  
"jdbc:oracle:thin:@localhost:1521:xe","system","oracle");  

//step3 create the statement object  
 stmt=con.createStatement();  

//step4 execute query  
 rs=stmt.executeQuery("select * from emp");  
while(rs.next())  
System.out.println(rs.getInt(1)+"  "+rs.getString(2)+"  "+rs.getString(3));  

//step5 close the connection object  
con.close();   //如果上面代码抛出异常是执行不到这里的

}catch(Exception e){ System.out.println(e);}  

}finally{
            try {
            if(rs !=null)rs.close();
        } catch (Exception e) {
            logger.error(e.getMessage());
        }

        try {
            if(stmt !=null)stmt.close();
        } catch (Exception e) {
            logger.error(e.getMessage());
        }

        try {
            if(con !=null)con.close();
        } catch (Exception e) {
            logger.error(e.getMessage());
        }

    } 

}  

上述代码摘自:https://blog.csdn.net/u013565163/article/details/76037448
原文也对这种写法做了解释,当JDBC在执行的过程中如果发生了异常时,异常后面的语句是执行不到的,所以我们需要在最后的finally语句中执行连接的关闭操作,无论如何都可以在执行完JDBC操作之后关闭连接。当然在JDK1.8中我们有了更加方便的写法,那就是把实现了Closeable接口的类放在try()的括号中进行创建,try-catch语句会在最后释放这些连接。

try-catch-finally语句的执行顺序

其实try-catch-finally语句中比较让人混淆是如果多个语句块中都有return语句那最终会执行哪一个,刚开始学Java的时候我们都知道执行return语句后就会跳出当前函数(break只会跳出当前循环)。这里需要说明的是return语句是分两步执行的,第一步是先算出结果,第二步是返回结果,下面的逻辑说明会用到这个规则。

  • 假设没有finally语句

try语句块与catch语句块是两个相互对立的,如果没有发生异常则将try语句块执行完,如果发生异常则从异常点跳转到catch语句块然后执行完毕。

  • 加上finally语句

加上finally语句之后就变得复杂一些了,因为这会涉及到代码的跳转。下面我们分两种情况来讨论,一种是函数有返回结果,一种是没有返回结果的。如果函数没有返回结果,那么函数中代码执行的顺序是try语句块或者catch语句块,最后是finally语句块。如果函数有返回结果首先会执行到try或者catch语句的return语句,算出返回值,然后跳转到finally语句块中,如果finally中有return语句则返回结果,结束函数,如果finally中没有return语句则finally语句块执行完毕后会跳转到try或者catch中的return处返回之前计算出来的结果,函数结束。

发表评论

电子邮件地址不会被公开。 必填项已用*标注