日期:2014-05-20  浏览次数:20861 次

新人求助 关于异常的问题
本帖最后由 qq282123971 于 2012-12-14 22:26:00 编辑
我最近在做一个项目(学校课程的项目),又刚好看了thinking in java的异常那一章 所以在数据库查询数据库的时候用了几个try-catch 希望能够保证结果集和数据库连接在异常的情况下也能被关闭,但是这样一来代码好像又显得很乱  希望大家帮我看看这样做应该不应该 在这里谢过 下面是代码 第一次发帖 不知该给几分... 
//获取数据库连接
public class Connection {
//获取数据库连接
public static java.sql.Connection getConnection() throws SQLException{
java.sql.Connection conn=null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
try {
conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;database=GMS;","sa","lanjinjiu");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new SQLException();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}

}


public ArrayList queryObject() {
// TODO Auto-generated method stub
ArrayList<PEObjectPO> objectList=null;//用作存放封装好项目数据的PEObject
String sql="select ObjectID,ObjectName from PEObject";//查询项目的SQL语句
try {
java.sql.Connection conn=JDBC.Connection.getConnection();//获得数据库连接
try{
PreparedStatement ps=conn.prepareStatement(sql);//SQL语句预编译
try{
ResultSet rs=ps.executeQuery();//获得查询的结果集
try{
objectList=new ArrayList<PEObjectPO>();
while(rs.next()){
PEObjectPO peObject=new PEObjectPO();//用作封装项目数据
peObject.setObjectID(rs.getInt(1));
peObject.setObjectName(rs.getString(2));
objectList.add(peObject);
}
rs.close();//查询完成,关闭结果集
conn.close();//查询完成,关闭数据库连接
       }catch(Exception e){
        rs.close();
        conn.close();
        objectList=new ArrayList<PEObjectPO>();
}
    }catch(SQLException e){
     conn.close();
     objectList=new ArrayList<PEObjectPO>();
    }

   }catch(SQLException e){
conn.close();
objectList=new ArrayList<PEObjectPO>();
   }
    } catch (SQLException e) {
// TODO Auto-generated catch block
objectList=new ArrayList<PEObjectPO>();
}
return objectList;
}
------解决方案--------------------
使用finally,将要关闭的资源放到里面
------解决方案--------------------

try {
 java.sql.Connection conn=JDBC.Connection.getConnection();//获得数据库连接
try{
 PreparedStatement ps=conn.prepareStatement(sql);//SQL语句预编译
try{
 ResultSet rs=ps.executeQuery();//获得查询的结果集
try{
 objectList=new ArrayList<PEObjectPO>();
 while(rs.next()){
 PEObjectPO peObject=new PEObjectPO();//用作封装项目数据
peObject.setObjectID(rs.getInt(1));
 peObject.setObjectName(rs.getString(2));
 objectList.add(peObject);
 }


感觉把这些语句放到一个try就可以了,finally关闭一下数据库