【问题标题】:Exceptions in Swing from helper classes来自辅助类的 Swing 异常
【发布时间】:2018-08-05 06:01:18
【问题描述】:

我正在做一个家庭作业,将this Knock Knock 应用程序的 Java 教程转换为 Swing GUI 应用程序并使用多线程。

我有抛出异常的辅助类。这些类不扩展 JFrame,我无法创建新的 JOptionPane 来显示异常。您将如何向用户显示该异常?

例如:我有一个类从两个文本文件(一个用于线索,一个用于答案)中加载笑话。如果在我期望的位置找不到文本文件,我将抛出 NullPointerException。因为这是一个辅助类,所以它没有扩展 JFrame。我如何将该消息与用户联系起来?我是否只引用 javax.swing.JOptionPane showMessageDialog 方法,就像我在下面的代码中那样,或者我可以有另一个代理类来捕获异常并显示它们?

    private final void getFilePath(ResponseFiles fileToGet) {
    String packagePath = "/com/knockknock/message";

    try {
    if (fileToGet == ResponseFiles.CLUES)
        file = new File(getClass().getResource(String.format("%s/clues.txt", packagePath)).getPath());
    else if (fileToGet == ResponseFiles.ANSWERS)
        file = new File(getClass().getResource(String.format("%s/answers.txt", packagePath)).getPath());
    } catch (NullPointerException e) {
        javax.swing.JOptionPane.showMessageDialog(null, "Jokes Files Missing", "File Missing", JOptionPane.ERROR_MESSAGE); 
    }

你怎么看?

【问题讨论】:

  • 显示异常最简单的方法就是把它一直扔到顶部,让系统打印出来。您还可以使用记录器记录异常,在 SEVERE 时它通常会打印所有内容。
  • 但是如果你只是想显示消息,最简单的方法就是调用 EDT 并使用 JOptionPane 静态方法显示消息:docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
  • 看我没想到。我试图扩展 JFrame,这样我就可以使用 JOptionPane,我确信这不是要走的路。我已经编辑了我的原始帖子,现在我有了新的方法。您认为值得拥有一个接受异常并打印出消息的代理类吗?或者那是不必要的复杂性?

标签: java multithreading swing exception-handling


【解决方案1】:

您可以传递异常并单独处理它,而不是在业务层中使用 Swing 组件。

有一些自定义异常处理程序类,您可以在其中处理运行时/已检查/自定义异常。

public class ExceptionHandler {
    public void handleException(Exception exp) {
        if (exp instanceof NullPointerException) {
            javax.swing.JOptionPane.showMessageDialog(null,
                    "Jokes Files Missing", "File Missing",
                    JOptionPane.ERROR_MESSAGE);
        } else if (exp instanceof IOException) {
            javax.swing.JOptionPane.showMessageDialog(null, "Test", "Test",
                    JOptionPane.ERROR_MESSAGE);
        }
        //Handle other exceptions
    }
}

改变你的方法

private final void getFilePath(ResponseFiles fileToGet) {
    String packagePath = "/com/knockknock/message";

    if (fileToGet == ResponseFiles.CLUES)
        file = new File(getClass().getResource(
                String.format("%s/clues.txt", packagePath)).getPath());
    else if (fileToGet == ResponseFiles.ANSWERS)
        file = new File(getClass().getResource(
                String.format("%s/answers.txt", packagePath)).getPath());
}

在完成 GUI 交互的业务层中,您可以像这样处理异常。在您的情况下,因为它是运行时异常,所以不需要显式抛出。

    try {
        getFilePath(ResponseFiles.CLUES);
    } catch (Exception e) {
        new ExceptionHandler().handleException(e);
    }

【讨论】:

  • 谢谢!这正是我想要的。所以我猜如果你有多个抛出异常的类,例如 IOException,你会检查异常的类型,然后检查异常起源的玻璃。这将在这个小程序中工作,但只是出于好奇,这是您在大型工业应用中的做法吗?
  • 在这方面有几种设计模式。最常见的设计之一是编写自定义异常并在所有类中传递自定义异常。每个自定义异常都将包含要在屏幕上显示的消息、要在日志文件中记录的消息、异常的堆栈跟踪。
猜你喜欢
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多