指定具体的Exception,而不是所有异常的捕捉方式都一样。如果在面试中,考官让你写个非常非常简单的JDBC连接程序,你会觉得这么easy的程序还考我?其实你并没有领会到其中的奥妙,你写完的程序和下面的对比之后,你会得到什么启发呢?是不是具体的Exception捕捉,看上去程序逻辑更清晰一些呢?
import java.sql.*;
public class TestJDBC {
public static void main(String[] args) {
ResultSet rs = null;
try {
Class.forName(" oracle.jdbc.OracleDriver ");
// new oracle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:TEST , scott , tiger");
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from dept ");
while (rs.next()) {
System.out.println(rs.getString("deptno"));
System.out.println(rs.getInt(" deptno"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
rs = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
rs = null;
stmt = null;
conn = null;
e.printStackTrace();
}
}
}
}
import java.sql.*;
public class TestJDBC {
public static void main(String[] args) {
// 这些对象初始化为null并放在try....catch外
Connection conn = null;
Statement stmt = null;
try {
Class.forName(" oracle.jdbc.OracleDriver ");
// new oracle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:TEST , scott , tiger");
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from dept ");
while (rs.next()) {
System.out.println(rs.getString("deptno"));
System.out.println(rs.getInt(" deptno"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
rs = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
rs = null;
stmt = null;
conn = null;
e.printStackTrace();
}
}
}
}
当把rs,stmt,conn 设为null后,它们只是不指向该对象了,垃圾回收器会在适当的时候收回,释放内存。