2012-03-09 9 views
0

このJavaコードは、データベースのデータをJSFテーブルに表示するために使用するマネージドBeanの一部です。try-catch例外を使用してこのコードを改善する方法

//connect to DB and get customer list 
public List<Dashboard> getDashboardList() throws SQLException { 

    if (ds == null) { 
     throw new SQLException("Can't get data source"); 
    } 

    //get database connection 
    Connection con = ds.getConnection(); 

    if (con == null) { 
     throw new SQLException("Can't get database connection"); 
    } 

    PreparedStatement ps = con.prepareStatement(
      "SELECT * from GLOBALSETTINGS"); 

    //get customer data from database 
    ResultSet result = ps.executeQuery(); 

    List<Dashboard> list = new ArrayList<Dashboard>(); 

    while (result.next()) { 
     Dashboard cust = new Dashboard(); 

     cust.setUser(result.getString("SessionTTL")); 
     cust.setPassword(result.getString("MAXACTIVEUSERS")); 


     //store all data into a List 
     list.add(cust); 
    } 
    ps.close(); 
    con.close(); 
    return list;   
} 

このコードを改善してtry catch文を挿入します。これを行う適切な方法は何ですか?

+1

私は完全に質問を理解していません。 try/catchを、コードを生成できるコードのまわりに置いてください。コメントはそれほど有用ではありません、btw。 –

+0

投稿したコードに何が間違っていると思いますか? – unholysampler

+0

'ps.executeQuery()'が 'SQLException'をスローすると、何が起きるか(むしろ起こらないでしょうか?) 'ps.close()'や 'con.close()'は今まで呼ばれていますか?これを考慮し、 'try' /' catch'/'finally'を使ってどのように修正するのかを判断してください。 –

答えて

2

のtry-catch exeptionsでこのコードを改善するためにどのように?

あなたはおよそ改善、多分組織化を求めていないので、あなたは、あなたの質問のタイトルを確認することができます。あなたのコードに基づいて、例外をキャッチすることについてよりきれいに整理されるようにメソッドを変更しました。

public List<Dashboard> getDashboardList(DataSource ds) 
{ 
    List<Dashboard> list = new ArrayList<Dashboard>(); 
    Connection con = null; 
    PreparedStatement ps = null; 
    try 
    { 
     con = ds.getConnection(); 
     ps = con.prepareStatement("SELECT * from GLOBALSETTINGS"); 
     //get customer data from database 
     ResultSet result = ps.executeQuery(); 
     while (result.next()) 
     { 
      Dashboard cust = new Dashboard(); 
      cust.setUser(result.getString("SessionTTL")); 
      cust.setPassword(result.getString("MAXACTIVEUSERS")); 
      list.add(cust); 
     } 
    } 
    catch(Exception e1) 
    { 
     // Log the exception. 
    } 
    finally 
    { 
     try 
     { 
      if(ps != null) 
        ps.close(); 
      if(con != null) 
        con.close(); 
     } 
     catch(Exception e2) 
     { 
      // Log the exception. 
     } 
    } 
    return list; 
} 
+2

'' ps.close'と 'con.close'は例外をスローするかもしれません。それらをtry catchブロックにも囲みたいと思っています。 –

+0

@maple_shaftありがとう、私はその点を逃して、私のコードを修正しました。 – Juvanis

+1

これをコピーしないでください... –

1

あなたが正しいことを意味しているかどうかはわかりませんが、メソッドからトップthrows SQLExceptionを削除すると、IDEはキャッチされていない例外についてツールチップを表示し、欠落した例外を自動的に挿入することができます。

2

なぜそれをしたいですか?何らかのエラーが発生した場合、このメソッドは実際に何をすべきか分からないので、そのような場合には例外をスローするのが適切です。

私は変化するであろう唯一のものは接続を閉じるには、最終的にメソッドを追加します

try { 
    PreparedStatement ps = con.prepareStatement(
      "SELECT * from GLOBALSETTINGS"); 

    //get customer data from database 
    ResultSet result = ps.executeQuery(); 

    List<Dashboard> list = new ArrayList<Dashboard>(); 

    while (result.next()) { 
     Dashboard cust = new Dashboard(); 

     cust.setUser(result.getString("SessionTTL")); 
     cust.setPassword(result.getString("MAXACTIVEUSERS")); 


     //store all data into a List 
     list.add(cust); 
    } 
} 
finally { 
    ps.close(); 
    con.close(); 
} 
+1

例外をスローすると、try catchでそれらをラップすることもできます。 –

+0

リソースごとに1つの 'try-finally'! 'リソースリソース= acquire(); try {resource.use(); } finally {resource.release(); } 'または現在のJavaでは、' try(Resource resource = acquire()){resource.use(); } 'を使用するか、Execute Aroundイディオムを使用します。この特定の例では、 'ps'はスコープの外にあり、' ResultSet'は明示的に閉じなければなりません。 –

+0

psはfinallyブロックに表示されません。 – tom

1

これはかなり基本的なJavaのものなので、本を拾い、基本を学ぶことをおすすめします。にもかかわらず、私は通常以下のようなことをします

Connection conn = null; 
try { 
    // DB code 
} catch (SQLException se) { 
    log.error("Experienced SQLException in method foo", se); 
    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Oops! You messed up!", null); 
    FacesContext.getCurrentInstance().addMessage(null, msg); 
} finally { 
    if (conn != null && conn.isOpen()) { 
    try { 
     conn.close(); 
    } catch (SQLException see) { 
     log.error("Connection can't be closed!"); 
     // Faces message or something like it 
    } 
}