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/