如何捕获基本异常并在UI-java上显示
我有一个swing应用程序,其中用户从JComboBox中选择一个数据库,并在JTextArea中提供一个查询,点击按钮后,结果显示在JTable中 点击按钮的代码如何捕获基本异常并在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
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;