Frage

Ich versuche, im Grunde von einer Methode zurückgeben, die Benutzereingabe von dem Standardeingabe-Stream liest. Da der Benutzer die Möglichkeit hat, die Anwendung zu beenden, ich versuche, aus dem besten Weg, um diesen Ausfahrt . Im Idealfall werde ich von begin() zurückkehren kann und main() ausreden, damit die applicaiton quiting.

public static void main(String[] args) {
     begin();
}

private static void begin(){
        Machine aMachine = new Machine();
        String select=null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            try {
                select = br.readLine();
            } catch (IOException ioe) {
                System.out.println("IO error trying to read your selection");
                return;
            }catch(Exception ex){
                System.out.println("Error trying to evaluate your input");
                return;
            }

            if (Pattern.matches("[RQrq1-6]", select)) {
                aMachine.getCommand(select.toUpperCase()).execute(aMachine);
            }
            else {                
                System.out.println(aMachine.badCommand()+select);
                aMachine.getStatus();
            }
        }
    }

Die Hauptlogik erfolgt, wenn aMachine mit diesem Verfahren wird ein gegebener Befehl durch den Benutzer ausführt:

aMachine.getCommand(select.toUpperCase()).execute(aMachine);

Auch hier ist die Frage, wie die Anwendung zu beenden, sobald der Benutzer den Befehl Q eintritt, oder q. Der beenden Befehl ist wie folgt:

public class CommandQuit implements Command {

    public void execute(Machine aMachine) {
        aMachine.getStatus();
        return; //I would expect this to force begin() to exit and give control back to main()
    }
}

folgt nun die Ratschläge aus meiner früheren Frage , um die Anwendung zu beenden, ich versuche zu main () und im Grunde läßt main () komplett zurückzukehren. Auf diese Weise vermeiden ich jegliche Verwendung von System.exit(0), obwohl das auch in Ordnung sein würde.

So, in diesem Beispiel, ich habe eine return Anweisung in der execute Methode der CommandQuit Klasse, die aufgerufen wird, wenn wir ein Q oder q von dem Benutzer empfangen. Wenn jedoch begin() ein Befehl beenden ausführt, anstatt aus der while(true) Schleife Rückkehr aus begin() und zurück in main() die Steuer fließt nie auf die return; im execute Methode von CommandQuit zu reagieren scheint.

Gibt es etwas, dass ich in meinem Beispiel bin fehlt? Vielleicht etwas ist so offensichtlich, dass ich es nicht zur Zeit sehen kann. Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Die return-Anweisung in execute() kehrt von execute(), begin() nicht. In der Regel in diesen Fällen CommandQuit.execute() setzt ein Flag auf aMachine und dann begin() prüft die Flagge an der Spitze der Schleife:

while (aMachine.stillRunning()) {  // instead of while (true)
    ...
    // This will clear aMachine.stillRunning() if the user quits.
    aMachine.getCommand(select.toUpperCase()).execute(aMachine);
}

Andere Tipps

return;

gibt immer von der aktuellen Funktion nur (in diesem Fall CommandQuit.execute). Es ist genau die gleiche wie nach dem Ende der Funktion ausgeführt wird. Sie könnten eine Flagge in aMachine gesetzt, und die while-Schleife laufen lassen, bis sie für immer statt Laufen eingestellt ist:

in der Klasse "Maschine" Sie hätte:

    private boolean isRunning = false;
    public boolean stillRunning() {
        return isRunning;
    }
    public void stopRunning() {
        isRunning = false;
    }

, und Sie würden Schleife während aMachine.stillRunning () und Call aMachine.stopRunning (), um es zu stoppen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top