为什么我们不能从actionPerformed()中“抛出”异常

时间:2013-09-17 07:06:02

标签: java exception exception-handling action actionlistener

我的项目中有以下代码片段,工作正常。我试图将PropertyVetoException传播回调用者。删除try-catch块并写入public void actionPerformed(ActionEvent e)throws PropertyVetoException会产生编译错误。为什么会如此。?如何将异常传播回调用者。我知道事件生成方法不是'调用者',但我想将异常传播到此事件生成方法,指示已发生异常并采取纠正措施。

  public void actionPerformed(ActionEvent e) {
     if(CMD_CHILD.equalsIgnoreCase(e.getActionCommand())) {
          if(child.getTitle().equalsIgnoreCase(title)) {
              try {
                 child.setSelected(true);
              } catch (PropertyVetoException e1) {
                 e1.printStackTrace();
              }
           }
       }
   }

2 个答案:

答案 0 :(得分:4)

由于actionPerformed接口指定了ActionListener,并且在该接口中,没有throws表示该方法可能会抛出任何已检查的异常。

当从超类重写方法或从接口实现方法时,覆盖或实现方法不会抛出超出超类或接口中指定的异常。

除此之外,你为什么要这样做? actionPerformed由Swing GUI框架调用,您希望Swing对异常做什么?

答案 1 :(得分:4)

您正在实现的接口(ActionListener)未声明方法actionPerformed的异常。您无法在该接口的实现类中更改方法签名。

如果要将异常抛出到事件生成器,则可以将其转换为RuntimeException,而不需要在方法签名中声明。

} catch (PropertyVetoEception e1) {
    throw new RuntimeException(e1);
}

当然,RuntimeException有点通用,您可以定义自己的特定于应用程序的异常,例如:

public class EventExecutionException extends RuntimeException {
    ...
}