我有一个Java作业,但在以下几点上有些卡住:


创建WindowMalfunction和PowerOut事件以模拟可能在GreenhouseControls中发生的问题。该事件应在GreenhouseControls中适当设置以下布尔变量:
windowok = false;
poweron = false;
设置变量后,WindowMalfunction或PowerOut应该引发异常,以指定错误条件。为此创建一个ControllerException类,该类扩展了Exception。
如果WindowMalfunction或PowerOut引发了异常,则Controller会捕获该异常,然后使用适当的消息启动紧急关机。向Controller添加一个名为shutdown的方法,并在GreenhouseControls中重写此方法以完成关闭。
在GreenhouseControls中添加一个名为errorcode的实例变量。它使用int变量错误代码(对于WindowMalfunction为1,对于PowerOut为2)中的错误代码指示问题的性质,并在当前目录中名为error.log的文本文件中记录时间和关闭原因,并进行打印到控制台。然后,在退出之前,它将序列化整个GreenhouseControls对象并将其保存在当前目录中的dump.out文件中。


到目前为止,这是我所做的(不多),我不确定如何抛出和捕获异常。

    private boolean windowork;

    public class WinidowMalfunction extends Event {
        public WinidowMalfunction(long delayTime) {
            super(delayTime);
        }

        public void action() {
            windowork = false;
        }
    }

    private boolean poweron;

    public class PowerOut extends Event {
        public PowerOut(long delayTime) {
            super(delayTime);
        }

        public void action() {
            poweron = false;
        }
    }

    public class ControllerException extends Exception {
        public ControllerEception(String except) {
            super(except);
        }

        public String getMessage() {
            return super.getMessage();
        }

        public void shutdown() {

        }
    }


如果需要的话,这里是完整的项目代码:
GreenhouseControls.java

import java.io.*;
import java.util.Calendar;
import java.util.Scanner;

import tme3.*;

public class GreenhouseControls extends Controller {
    private boolean light = false;
    private boolean water = false;
    private String thermostat = "Day";
    private String eventsFile = "example1.txt";


    public class LightOn extends Event {
        public LightOn(long delayTime) { super(delayTime); }
        public void action() {
            // Put hardware control code here to
            // physically turn on the light.
            light = true;
        }
        public String toString() { return "Light is on"; }
    }
    public class LightOff extends Event {
        public LightOff(long delayTime) { super(delayTime); }
        public void action() {
            // Put hardware control code here to
            // physically turn off the light.
            light = false;
        }
        public String toString() { return "Light is off"; }
    }
    public class WaterOn extends Event {
        public WaterOn(long delayTime) { super(delayTime); }
        public void action() {
            // Put hardware control code here.
            water = true;
        }
        public String toString() {
            return "Greenhouse water is on";
        }
    }
    public class WaterOff extends Event {
        public WaterOff(long delayTime) { super(delayTime); }
        public void action() {
            // Put hardware control code here.
            water = false;
        }
        public String toString() {
            return "Greenhouse water is off";
        }
    }
    public class ThermostatNight extends Event {
        public ThermostatNight(long delayTime) {
            super(delayTime);
        }
        public void action() {
            // Put hardware control code here.
            thermostat = "Night";
        }
        public String toString() {
            return "Thermostat on night setting";
        }
    }
    public class ThermostatDay extends Event {
        public ThermostatDay(long delayTime) {
            super(delayTime);
        }
        public void action() {
            // Put hardware control code here.
            thermostat = "Day";
        }
        public String toString() {
            return "Thermostat on day setting";
        }
    }

    // An example of an action() that inserts a
    // new one of itself into the event list:
    public class Bell extends Event {
        public Bell(long delayTime) {
            super(delayTime);
        }

        public void action() {
            addEvent(new Bell(delayTime));
        }

        public String toString() { return "Bing!"; }
    }

    private boolean fans;

    public class FansOn extends Event {
        public FansOn(long delayTime) {
            super(delayTime);
        }

        public void action() {
            fans = true;
        }

        public String toString() {
            return "Fans are on";
        }
    }

    public class FansOff extends Event {
        public FansOff(long delayTime) {
            super (delayTime);
        }

        public void action() {
            fans = false;
        }

        public String toString() {
            return "Fans are off";
        }
    }

    private boolean windowork;

    public class WinidowMalfunction extends Event {
        public WinidowMalfunction(long delayTime) {
            super(delayTime);
        }

        public void action() {
            windowork = false;
        }
    }

    private boolean poweron;

    public class PowerOut extends Event {
        public PowerOut(long delayTime) {
            super(delayTime);
        }

        public void action() {
            poweron = false;
        }
    }

    public class ControllerException extends Exception {
        public ControllerEception(String except) {
            super(except);
        }

        public String getMessage() {
            return super.getMessage();
        }

        public void shutdown() {

        }
    }

    public class Restart extends Event {
        public Restart(long delayTime, String filename) {
            super(delayTime);
            eventsFile = filename;
        }

        public void action() {
            Scanner scanner = new Scanner(eventsFile);
            while(scanner.hasNextLine()) {
                String line = scanner.nextLine();
            }

            addEvent(new ThermostatNight(0));
            addEvent(new LightOn(2000));
            addEvent(new WaterOff(8000));
            addEvent(new ThermostatDay(10000));
            addEvent(new Bell(2000));
            addEvent(new WaterOn(6000));
            addEvent(new LightOff(4000));
            addEvent(new Terminate(12000));
            addEvent(new FansOn(5000));
            addEvent(new FansOff(1000));
        }

        public String toString() {
            return "Restarting system";
        }
    }

    public class Terminate extends Event {
        public Terminate(long delayTime) { super(delayTime); }
        public void action() { System.exit(0); }
        public String toString() { return "Terminating";  }
    }


    public static void printUsage() {
        System.out.println("Correct format: ");
        System.out.println("  java GreenhouseControls -f <filename>, or");
        System.out.println("  java GreenhouseControls -d dump.out");
    }

    //---------------------------------------------------------
    public static void main(String[] args) {
        try {
            String option = args[0];
            String filename = args[1];

            if ( !(option.equals("-f")) && !(option.equals("-d")) ) {
                System.out.println("Invalid option");
                printUsage();
            }

            GreenhouseControls gc = new GreenhouseControls();

            if (option.equals("-f"))  {
                gc.addEvent(gc.new Restart(0,filename));
            }

            gc.run();
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Invalid number of parameters");
            printUsage();
        }
    }

} ///:~


Controller.java

package tme3;
import java.util.*;


public class Controller {
  // A class from java.util to hold Event objects:
  private List<Event> eventList = new ArrayList<Event>();
  public void addEvent(Event c) { eventList.add(c); }

  public void run() {
    while(eventList.size() > 0)
      // Make a copy so you're not modifying the list
      // while you're selecting the elements in it:
      for(Event e : new ArrayList<Event>(eventList))
        if(e.ready()) {
          System.out.println(e);
          e.action();
          eventList.remove(e);
        }
  }
} ///:~


Event.java

package tme3;

import java.io.*;

public abstract class Event {
  private long eventTime;
  protected final long delayTime;
  public Event(long delayTime) {
    this.delayTime = delayTime;
    start();
  }
  public void start() { // Allows restarting
    eventTime = System.currentTimeMillis() + delayTime;
  }
  public boolean ready() {
    return System.currentTimeMillis() >= eventTime;
  }
  public abstract void action();
} ///:~

最佳答案

添加了代码注释以了解它。

GreenhouseControls.java

package tme3;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class GreenhouseControls extends Controller {
    private boolean light = false;
    private boolean water = false;
    private String thermostat = "Day";
    private String eventsFile = "example1.txt";

    // 3. Add an instance variable in GreenhouseControls called error code.
    private int errorCode;

    public class LightOn extends Event {
        public LightOn(long delayTime) {
            super(delayTime);
        }

        public void action() {
            // Put hardware control code here to
            // physically turn on the light.
            light = true;
        }

        public String toString() {
            return "Light is on";
        }
    }

    public class LightOff extends Event {
        public LightOff(long delayTime) {
            super(delayTime);
        }

        public void action() {
            // Put hardware control code here to
            // physically turn off the light.
            light = false;
        }

        public String toString() {
            return "Light is off";
        }
    }

    public class WaterOn extends Event {
        public WaterOn(long delayTime) {
            super(delayTime);
        }

        public void action() {
            // Put hardware control code here.
            water = true;
        }

        public String toString() {
            return "Greenhouse water is on";
        }
    }

    public class WaterOff extends Event {
        public WaterOff(long delayTime) {
            super(delayTime);
        }

        public void action() {
            // Put hardware control code here.
            water = false;
        }

        public String toString() {
            return "Greenhouse water is off";
        }
    }

    public class ThermostatNight extends Event {
        public ThermostatNight(long delayTime) {
            super(delayTime);
        }

        public void action() {
            // Put hardware control code here.
            thermostat = "Night";
        }

        public String toString() {
            return "Thermostat on night setting";
        }
    }

    public class ThermostatDay extends Event {
        public ThermostatDay(long delayTime) {
            super(delayTime);
        }

        public void action() {
            // Put hardware control code here.
            thermostat = "Day";
        }

        public String toString() {
            return "Thermostat on day setting";
        }
    }

    // An example of an action() that inserts a
    // new one of itself into the event list:
    public class Bell extends Event {
        public Bell(long delayTime) {
            super(delayTime);
        }

        public void action() {
            addEvent(new Bell(delayTime));
        }

        public String toString() {
            return "Bing!";
        }
    }

    private boolean fans;

    public class FansOn extends Event {
        public FansOn(long delayTime) {
            super(delayTime);
        }

        public void action() {
            fans = true;
        }

        public String toString() {
            return "Fans are on";
        }
    }

    public class FansOff extends Event {
        public FansOff(long delayTime) {
            super(delayTime);
        }

        public void action() {
            fans = false;
        }

        public String toString() {
            return "Fans are off";
        }
    }

    private boolean windowork;

    public class WinidowMalfunction extends Event {

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

        // 1. After setting the variables, WindowMalfunction or PowerOut should throw an
        // exception specifying the faulty condition
        public void action() throws ControllerException {
            windowork = false;
            // 3. error code in an int variable error code -> 1 for WindowMalfunction
            someThingWentWrongHere(1, "Error at WinidowMalfunction");
        }

    }

    private boolean poweron;

    public class PowerOut extends Event {

        public PowerOut(long delayTime) {
            super(delayTime);

        }

        // 1. After setting the variables, WindowMalfunction or PowerOut should throw an
        // exception specifying the faulty condition
        public void action() throws ControllerException {
            poweron = false;
            // 3. error code in an int variable error code -> 2 for powerOut
            someThingWentWrongHere(2, "Error at powerOut event");
        }

    }

    void someThingWentWrongHere(int errorCode, String errorMessage) throws ControllerException {
        this.errorCode = errorCode;
        throw new ControllerException(errorMessage);
    }

    public class ControllerException extends Exception {
        public ControllerException(String except) {
            super(except);
        }

        public String getMessage() {
            return super.getMessage();
        }

        public void shutdown() {

        }
    }

    public class Restart extends Event {
        public Restart(long delayTime, String filename) {
            super(delayTime);
            eventsFile = filename;
        }

        public void action() {
            Scanner scanner = new Scanner(eventsFile);
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
            }

            addEvent(new ThermostatNight(0));
            addEvent(new LightOn(2000));
            addEvent(new WaterOff(8000));
            addEvent(new ThermostatDay(10000));
            addEvent(new Bell(2000));
            addEvent(new WaterOn(6000));
            addEvent(new LightOff(4000));
            addEvent(new Terminate(12000));
            addEvent(new FansOn(5000));
            addEvent(new FansOff(1000));
        }

        public String toString() {
            return "Restarting system";
        }
    }

    public class Terminate extends Event {
        public Terminate(long delayTime) {
            super(delayTime);
        }

        public void action() {
            System.exit(0);
        }

        public String toString() {
            return "Terminating";
        }
    }

    public static void printUsage() {
        System.out.println("Correct format: ");
        System.out.println("  java GreenhouseControls -f <filename>, or");
        System.out.println("  java GreenhouseControls -d dump.out");
    }

    // ---------------------------------------------------------
    public static void main(String[] args) {
        GreenhouseControls gc = new GreenhouseControls();

        try {
            /*
             * String option = args[0]; String filename = args[1];
             *
             * if (!(option.equals("-f")) && !(option.equals("-d"))) {
             * System.out.println("Invalid option"); printUsage(); }
             *
             * if (option.equals("-f")) { gc.addEvent(gc.new Restart(0, filename)); }
             */

            // UnCommenting above code will never test below code because above code with
            // throw first exception and it will never execute below code

            // To test PowerOut fail with exception
            // gc.addEvent(gc.new PowerOut(100));

            // To test WinidowMalfunction fail with exception
            gc.addEvent(gc.new WinidowMalfunction(100));

            gc.run();
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Invalid number of parameters");
            printUsage();
        }
        // 2. the Controller catches the exception
        catch (ControllerException e) {
            // 2. then initiates an emergency shutdown with an appropriate message
            gc.shutdown(e.getMessage());
        }

    }

    // override this method in GreenhouseControls to accomplish the shutdown.
    @Override
    protected void shutdown(String message) {
        // super.shutdown();
        DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
        Date dateobj = new Date();

        // logs the time and the reason for the shutdown in a text file ,, Here you will
        // create file and log it
        System.out.println("Shutdown due to Error: " + message + " | Error Code:" + errorCode + " | DateTime:" + df.format(dateobj));
    }

    /*
     * enum ErrorCode { WindowMalfunction, PowerOut }
     */
}



Controller.java

package tme3;

import java.util.*;

import tme3.GreenhouseControls.ControllerException;

public class Controller {
    // A class from java.util to hold Event objects:
    private List<Event> eventList = new ArrayList<Event>();

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

    public void run()  throws ControllerException{
        while (eventList.size() > 0)
            // Make a copy so you're not modifying the list
            // while you're selecting the elements in it:
            for (Event e : new ArrayList<Event>(eventList))
                if (e.ready()) {
                    System.out.println(e);
                    e.action();
                    eventList.remove(e);
                }
    }

    //2. Add a method to Controller called shutdown,
    protected void shutdown(String message) {
        System.out.println("ShutDown from controller");
    }
}


Event.java

package tme3;

import tme3.GreenhouseControls.ControllerException;

public abstract class Event {
    private long eventTime;
    protected final long delayTime;

    public Event(long delayTime) {
        this.delayTime = delayTime;
        start();
    }

    public void start() { // Allows restarting
        eventTime = System.currentTimeMillis() + delayTime;
    }

    public boolean ready() {
        return System.currentTimeMillis() >= eventTime;
    }

    public abstract void action()  throws ControllerException;
}

10-06 07:19