2013-12-16 3 views
1

У меня есть событие, и оно генерирует исключение, если «windowok» == false. Это, как я построил событие:Захват исключения и завершение программы

public class GreenhouseControls extends Controller { 

    public class WindowMalfunction extends Event { 

     private Boolean windowok = false; 

     private void set(Boolean windowok) { 
      this.windowok = windowok ; 
     } 

     public WindowMalfunction(long delayTime) { 
       super(delayTime); 
     } 

     public void action() throws ControllerException { 
      if (!windowok) { 
       throw new ControllerException("Window Malfunction", 1); 
      } 
     } 

     public String toString() { 
      return "Windok OK = " + windowok; 
     } 
    } 
} 

Исключение попадает в другой класс называется контроллером, например так:

public class Controller { 

    private List<Event> eventList = new ArrayList<Event>(); 
    private Long wait; 

    public void addEvent(Event c) { 
     eventList.add(c); 
    } 

    public void shutdown(Long wait) { 
     this.wait = wait; 
    } 

    public void run() { 
     while(eventList.size() > 0) 

     for(Event e : new ArrayList<Event>(eventList)) 
      if(e.ready()) { 
       System.out.println(e); 
      try { 
       e.action(); 
      } 
      catch(ControllerException ex) { 
       shutdown(); // WHAT DO I DO HERE? 
      } 
      eventList.remove(e); 
     } 

} 

мне нужно инициировать метод отключения() в классе контроллера для завершения , но для этого я должен переопределить метод shutdown() в классе GreenhouseControls. Где я должен переопределять этот метод в классе GreenhouseControls и должен ли я называть метод shutdown() в блоке catch или просто инициировать процесс, который вызовет переопределенный метод в классе GreenhouseControls?

+3

В качестве побочного примечания вы не должны использовать Вершины в штучной упаковке (Long, Boolean и т. Д.) Без цели. – Sinkingpoint

+2

Ваши имена переменных указывают на то, что текст вашего диалогового окна, вероятно, неверен. Используйте глаголы как кнопки, никогда не когда-либо «хорошо», «да» или «нет». – AJMansfield

+0

Чтобы решить главный вопрос, почему вам НУЖНО переопределить метод выключения. Непонятно, 1) что вы пытаетесь сделать, и 2) почему вы полагаете, что вам нужно сделать это так, как вы заявили. – user1445967

ответ

1

Я просто объявляю абстрактный метод shutdown в классе Controller, который будет реализован GreenhouseControls.

Я не знаю деталей вашей архитектуры, однако может быть полезно иметь абстрактный класс Controller (который не может быть создан), если более чем один класс расширяет его. Я полагаю, что процедура выключения будет отличаться для каждого типа контроллера, а затем, делая ее абстрактной, вы принудительно расширяете Controller для реализации пользовательской процедуры выключения. Если вместо этого процедура останова всегда одна и та же, вы можете реализовать ее непосредственно в Controller. Наконец, если некоторые предварительные процедуры являются общими для всех типов контроллеров, вы можете реализовать их в shutdown() внутри класса Controller и переопределить метод в производных классах, вызвав super.shutdown(); в качестве первого шага.

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