第一种:把if(...)语句放在外面
package com.itheima.util;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
private static Properties prop = null;
private JDBCUtils() {
}
static{
try {
prop = new Properties();
prop.load(new FileReader(JDBCUtils.class.getClassLoader().getResource("config.properties").getPath()));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
public static Connection getConn() throws ClassNotFoundException, SQLException{
Class.forName(prop.getProperty("driver"));
return DriverManager.getConnection(prop.getProperty("url"),prop.getProperty("user"),prop.getProperty("password"));
}
public static void close(ResultSet rs ,Statement stat ,Connection conn){
if(rs!=null){ //这个写在外边因为要置为null作打算
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace(); //throw new RuntimeException(e); 这个不能再这里转换抛出,因为这个是运行时异常,这样会运行rs=null,然后就停止运行了
//,会令到下面的stat,conn 不执行
}finally{
rs = null; //此处会使到try{rs.close }就算出现异常,rs置为null后会被垃圾回收机制回收,以下同
}
}
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
stat = null;
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
}
第二种,if语句放在里面
/**
* 释放资源
* @param conn
* @param st
* @param rs
*/
public static void closeResource(Connection conn,Statement st ,ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(),e);//这个即使使用了运行时异常下面也会执行,因为finally机制继续执行下去
} finally{ //但是自身如果出现异常的话还会占用一定的内存
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(),e);
} finally{
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(),e);
}
}
}
}
}
以上两种方法实际上是抛运行时异常的不同导致的,理解也从运行时异常着手