java - 在匿名 ActionListener 中调用抛出异常的方法,而不使用 try/catch

标签 java swing

public class Test {
public void buildGUI()
{
    JFrame frame = new JFrame();
    JButton send = new JButton("Send");
    send.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            send();
            frame.dispose();
        }
    });
    frame.add(send);
    frame.pack();
    frame.setVisible(true);
}
}

如果方法 send() 抛出 MyException,我如何将该异常从 Swing 线程迁移到我的类?

我想要对生成的异常做的是让另一个类实例化它并像这样捕获异常。

public class AnotherTest
{
    public AnotherTest()
    {
         Test t = new Test();
         try
         {
             t.buildGUI();
         }
         catch(MyException e)
         {
             //do stuff.
         }
     }
}

这就是我在概念上想要发生的事情,但是我知道 buildGUI 将在调用 actionPerformed 之前结束。那么,我如何捕获 AnotherTest 中 actionPerformed 中的潜在异常?

最佳答案

类不能抛出异常。只有方法可以。

并且类并不是可以执行的东西。可以执行一个方法。

执行 Action 监听器方法的是Swing事件调度线程。如果某个方法在监听器中抛出异常,您唯一能做的就是捕获它并以某种方式显示它:通过打开错误对话框,或将异常消息放在文本区域中,或其他任何方式。

    public void actionPerformed(ActionEvent e) {
        try {
            send();
        }
        catch (MyException e) {
            someTextArea.setText(e.getMessage());
        }
    }

如果您实际上想要从 Swing EDT 与主线程进行通信,您可以使用 BlockingQueue,并让主线程在队列上调用 take 和监听器 offer 队列异常。

任何其他线程通信机制都可以。但请确保不要阻止 EDT,否则整个 GUI 将卡住。

关于java - 在匿名 ActionListener 中调用抛出异常的方法,而不使用 try/catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933779/

相关文章:

java - swing 的文字处理组件

java - 康威的生命游戏 GUI

java - 提高 "drawString"方法文本质量

java - elasticsearch GEO 按距离由近到远搜索顺序

java - 在单元测试期间创建自定义 @TestScoped Guice 范围

java - 更改按钮数组中按钮的颜色并将其他按钮恢复为默认值

java - 如何在 Java Applet 中显示文本框、按钮等?

java - 当一个长进程正在运行时,如何在我的 JFrame 中加载动画 GIF?

java - 在 Tomcat 8 上启用 HTTPS 时出现问题

java - 如何审计 Java EE 项目?