2013-09-17 5 views
0

У меня есть следующий фрагмент кода в моем проекте, который отлично работает. Я пытался передать PropertyVetoException обратно вызывающему. Удаление блока try-catch и правка public void actionPerformed(ActionEvent e)throws PropertyVetoException дает ошибку при компиляции. Почему это так.? Как я могу распространить исключение обратно на вызывающего. Я знаю, что метод генерации событий не является «вызывающим», но я хочу распространить исключение на этот метод генерации событий, указав, что произошло исключение, и предпринять корректирующие действия.Почему мы не можем исключить из actionPerformed()

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

Поскольку договор 'ActionListener' не позволяет ему. В этом случае вызывающему абоненту все равно. Вероятно, он создается кнопкой на экране. Что вам может понадобиться, это предоставить некоторые средства, с помощью которых контроллер может справиться с исключением в этой ситуации, например, отображением и сообщением об ошибке для правильного состояния приложения. – MadProgrammer

+1

Интерфейс ActionListener определяет, какие методы можно вызывать, какие аргументы эти методы могут иметь и какие исключения они могут бросить. Это называется договором – MadProgrammer

ответ

4

Поскольку actionPerformed задаются с помощью интерфейса ActionListener, и в этом интерфейсе нет throws, чтобы указать, что этот метод может бросить любые проверяемое исключение.

При переопределении метода из суперкласса или реализации метода из интерфейса метод переопределения или реализации не может вызывать больше исключений, чем то, что было указано в суперклассе или интерфейсе.

Кроме того, почему вы хотите это сделать? actionPerformed вызывается инфраструктурой Swing GUI, что бы вы ожидали от Swing делать с исключением?

4

Интерфейс, который вы реализуете (ActionListener), не объявляет об исключении из метода actionPerformed. Вы не можете изменить подпись метода в своем классе реализации этого интерфейса.

Если вы хотите выбросить исключение от производителя событий, вы можете преобразовать его в RuntimeException, который не должен быть объявлен в сигнатуре метода.

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

Конечно, RuntimeException немного общий, вы можете определить свое собственное, для конкретного применения исключения, такие как:

public class EventExecutionException extends RuntimeException { 
    ... 
} 
+1

+1 для предложения rte. – vikingsteve

+1

Что произойдет, если вы бросите «RuntimeException» из метода «actionPerformed»? Вероятно, вы не получите сообщение об ошибке. – Jesper

+0

Это совсем другая история. Разумеется, ваш ответ намного лучше моего. –

Смежные вопросы