如何捕获基本异常并在UI-java上显示

如何捕获基本异常并在UI-java上显示,java,swing,exception,exception-handling,Java,Swing,Exception,Exception Handling,我有一个swing应用程序,其中用户从JComboBox中选择一个数据库,并在JTextArea中提供一个查询,点击按钮后,结果显示在JTable中 点击按钮的代码 private void jbtnRunActionPerformed(java.awt.event.ActionEvent evt) { try { jtbResults.setModel(objtrm.runQuery(jcb

我有一个swing应用程序,其中用户从JComboBox中选择一个数据库,并在JTextArea中提供一个查询,点击按钮后,结果显示在JTable中

点击按钮的代码

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的methods类中。 此方法获取数据库名称和查询,从不同的类调用另一个方法,该类从此查询和数据库名称返回
ResultSet
(连接字符串存储在数据库中),将此
ResultSet
转换为
DefaultTableModel
,并返回它

现在,如果出现网络问题,我的class方法返回
ResultSet
抛出
IOException
,但我在JOptionPane上看到的只是error
无法设置空表模型
。控制台中的实际堆栈跟踪是

java.sql.SQLException:JZ006:捕获的IOException:java.net.UnknownHostException:au201d002v

我想向用户展示这个异常,而不是我得到的。 是否有不同的方法来处理这种情况,或者是否有来自
Exception
类的任何直接方法可以给出根本原因

我尝试了
e.getCause
,但它没有返回任何结果

编辑 运行查询方法

 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。)


感谢

Exception类的printStackTrace()方法是exceptions toString()方法和getStackTrace()方法的组合,它是在控制台中为您打印的

如果读取printStackTrace()的函数,它会告诉您从何处获取打印出的值。从本文档开始,您可以获取一个异常,并以类似于printStackTrace()输出的方式对其进行格式化


您的
runQuery
方法不会引发异常。相反,它处理它。这意味着异常永远不会到达
jbtnRunActionPerformed
中的
catch
子句

相反,如果出现错误,
runQuery
永远不会到达该行

     model  = new BuildTableModel().build(rs);
当出现异常时。异常在
runQuery
catch
中处理,打印堆栈跟踪并记录异常。但仅此而已——一旦处理了异常,它就不会被传播。代码继续到第行

    return model;
并且
模型
变量为空。这就是
jbtnRunActionPerformed
看到的。它从不例外

为了让上层处理异常,您需要抛出它。这意味着您必须将
runQuery
声明为
抛出IOException

此外,您不应该捕获
异常
。您应该始终只捕获
try
中的代码部分真正需要的异常。你的IDE应该能帮你做到这一点

  • 如果希望在更高级别上处理异常,请让方法抛出内部发生的异常,方法是不对这些异常使用
    try…catch
    ,而是在方法标题处使用
    throws
  • 仅处理任何
    catch
    子句中的特定异常

请注意,您在
RepositoryManager
方法中也在做同样的操作,因此您应该从那里开始修复它。

问题在于
runQuery()
方法正在捕获异常并将其打印到控制台,然后返回
null
。然后在
jbtnRunActionPerformed()
方法中,将
null
传递给
jtbResults.setModel(),
,这将导致您在作业窗格中看到的错误


因此,要么在
runQuery()
的catch块中显示JOptionPane,要么让
runQuery()
重新抛出异常,以便在尝试将null传递给
setModel()之前在
jbtnRunActionPerformed()中捕获它。

要准确地检查捕获,请执行
System.err.println(“--”)在printStacktrace之前。您可能正在捕获该IOException,然后将其丢弃,或者将其包装到您自己的异常中,而不将原始异常(原因)作为异常构造函数参数传递。修复这一点是有意义的。可能您看到的堆栈跟踪发生在前面。您确定
runQuery
真的引发了异常吗?您能显示它的代码吗?@realponsip run query调用与数据库相关的方法类,该类查询数据库并返回结果集。正是该类生成了该异常。。我将添加代码@real,这会产生相同的错误
无法设置空表模型
。我需要用户知道有一个
IOException
     model  = new BuildTableModel().build(rs);
    return model;