2015-08-14 16 views
0

我在其中用戶選擇從JComboBox的一個數據庫,並在JTextArea中和按鈕結果的點擊JTable中顯示提供了一個查詢Swing應用程序。如何捕捉到基異常,並顯示在用戶界面上 - java的

按鈕的代碼單擊

private void jbtnRunActionPerformed(java.awt.event.ActionEvent evt) {           
    try 
    { 
    jtbResults.setModel(objtrm.runQuery(jcbRepository.getSelectedItem().toString(), jtaQuery.getText())); 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 

     JOptionPane.showMessageDialog(this, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); 

    } 
}    

在這段代碼objtrm.runQuery是在方法的類此UI。 此方法採用數據庫名稱和查詢,調用不同類,這從該查詢和數據庫名稱返回ResultSet(連接字符串存儲在數據庫中)的另一種方法,將這個ResultSetDefaultTableModel並返回。

現在如果出現網絡問題,我的班級方法返回ResultSet會拋出IOException,但是我在JOptionPane上看到的所有錯誤都是錯誤Cannot set a null Table model。在控制檯的實際堆棧跟蹤是

值java.sql.SQLException:JZ006:捕獲到IOException:的java.net.UnknownHostException:au201d002v

我想告訴用戶這個例外,而不是我所得到的。 是否有不同的方法來處理這種情況,或者是否存在可以給出根本原因的類的任何直接方法。

我試過e.getCause,它什麼都沒有返回。

EDIT runQuery方法

public DefaultTableModel runQuery(String repoName,String query) 
    { 
     DefaultTableModel model =null; 
     new LoggingManager().addToLog("TestRepositoryUI Methods RunQuery"); 
    try 
    { 
     RepositoryManager rm = new RepositoryManager(); 
     Repository r = rm.getRepositoryByName(repoName); 
     ResultSet rs = rm.Repo_to_ResultSet(r.RepoID, query); 
     model = new BuildTableModel().build(rs); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     new LoggingManager().addToLog(e); 
    } 
     return model; 
} 

repo_to_resultset方法(這是這個方法,必將得到IOException的,因爲我不連接到網絡。)

case "Sybase": 
      try 
     { 
      new LoggingManager().addToLog("RM Repo_To_ResultSet() Sybase"); 
      Connection conn=null; 
      Statement s; 

      String connString = objRe.ConString; 
      Class.forName("com.sybase.jdbc3.jdbc.SybDriver"); 
      conn =  DriverManager.getConnection(connString,"username","pass"); 
      s = conn.createStatement(); 
      s.execute(query); 
      rs = s.getResultSet(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
      new LoggingManager().addToLog(e); 
     } 
     break; 

由於

+0

要準確地檢查捕獲重新拋出異常,因此將在jbtnRunActionPerformed()被抓,做到' System.err.println(「---」);'在printStacktrace之前。您可能會捕獲該IOException,然後將其拋出,或將其包裝在自己的異常中 - 而不傳遞原始異常(原因)作爲異常構造函數參數。修復這一點是有道理的。也許你看到的堆棧跟蹤發生得更早。 –

+0

你確定'runQuery'真的會拋出異常嗎?你能顯示它的代碼嗎? – RealSkeptic

+0

@RealSkeptic運行查詢調用數據庫相關的方法類,它查詢數據庫並返回結果集。正是這個類產生了這個異常。我將包含代碼 – Nikhar

回答

0

的異常類的printStackTrace()方法是控制檯中打印的內容,它是toString()方法的異常組合和getStackTrace()方法。

如果你讀的printStackTrace()的documentation,它告訴你在那裏的得到它打印出的值。從這個文檔開始,你可以採取一個例外的格式,並以與printStackTrace()輸出相似的方式進行格式化。

... 
} catch(Exception e) { 
    String trace = e.toString() + "\n"; 
    for(StackTraceElement element : e.getStackTrace()) 
     trace += element.toString() + "\n"; 
    JOptionPane.showMessageDialog(this, trace, "Error", JOptionPane.ERROR_MESSAGE); 
} 
+0

這給出了同樣的錯誤'不能設置空表模型'。我需要用戶知道有'IOException'。 – Nikhar

1

您的runQuery方法不會拋出異常。相反,它它處理它。這意味着例外將永遠不會到達jbtnRunActionPerformed中的catch子句。

相反,如果有錯誤,runQuery永遠不會到達行

 model = new BuildTableModel().build(rs); 

時,有一個例外。該異常被處理runQuery內部catch,堆棧跟蹤被印刷和異常記錄。但就是這樣 - 一旦你處理了異常,它就不會被傳播。代碼繼續行

return model; 

model變量爲空。所以這就是jbtnRunActionPerformed所見。它從來沒有看到例外。

爲了讓上層處理異常,你需要把它扔吧。這意味着您必須聲明runQuerythrows IOException

此外,你不應該抓住Exception。您應該始終只捕獲try中部分代碼的預期異常。你的IDE應該可以幫助你。

  • 我們的方法使用try...catch對於那些異常,而是在方法頭使用throws扔在它裏面所發生的異常,如果你想在上級來處理它們,通過
  • 只處理任何catch子句中的特定例外。

請注意,您在RepositoryManager方法中執行相同操作,因此您應該從此處開始修復它。

0

問題是您的runQuery()方法正在捕獲異常並將其打印到控制檯,然後返回null。然後在您的jbtnRunActionPerformed()方法null正在傳遞給jtbResults.setModel(),這會導致您在JOptionPane中看到的錯誤。

因此,無論顯示的JOptionPane在runQuery() catch塊或有runQuery()嘗試之前空傳遞給setModel().