来自助手类的Swing中的异常

时间:2018-02-25 19:10:15

标签: java multithreading swing exception-handling

我正在完成一项家庭作业,将Knock Knock应用程序的this Java Tutorial转换为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); 
    }
你怎么看?

1 个答案:

答案 0 :(得分:0)

您可以传递异常并单独处理它,而不是在业务层中使用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);
    }