невозможно вернуться к main () из метода, читающего стандартный поток ввода - PullRequest
0 голосов
/ 15 ноября 2009

Я в основном пытаюсь вернуться из метода, который читает пользовательский ввод из стандартного потока ввода. Поскольку у пользователя есть возможность выйти из приложения, я пытаюсь найти лучший способ сделать это exit . В идеале я смогу вернуться с begin() и позволить main() закончить, тем самым выйдя из приложения.

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();
            }
        }
    }

Основная логика имеет место, когда aMachine выполняет заданную команду пользователем следующим способом:

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

Опять-таки, проблема в том, как выйти из приложения, когда пользователь введет команду Q или q. Команда quit выглядит так:

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()
    }
}

Теперь, следуя совету из моего предыдущего вопроса , чтобы выйти из приложения, я пытаюсь вернуться к main () и в основном позволяю main () завершиться. Таким образом, я избегаю использования System.exit(0), хотя это тоже подойдет.

Итак, в этом примере у меня есть оператор return в методе execute класса CommandQuit, который вызывается, когда мы получаем Q или q от пользователя. Однако, когда begin() выполняет команду выхода, вместо возврата из цикла while(true), из begin() и обратно в main(), поток управления никогда не реагирует на return; в execute метод CommandQuit.

Есть ли что-то, чего мне не хватает в моем примере? Возможно, что-то настолько очевидно, что я не могу видеть это в данный момент. Спасибо за любую помощь.

Ответы [ 2 ]

4 голосов
/ 15 ноября 2009

Оператор возврата в execute() возвращается из execute(), а не begin(). Обычно в этих случаях CommandQuit.execute() устанавливает флаг на aMachine, а затем begin() проверяет флаг в верхней части цикла:

while (aMachine.stillRunning()) {  // instead of while (true)
    ...
    // This will clear aMachine.stillRunning() if the user quits.
    aMachine.getCommand(select.toUpperCase()).execute(aMachine);
}
0 голосов
/ 15 ноября 2009
return;

всегда возвращается только из текущей функции (в этом случае CommandQuit.execute). Это точно так же, как выполнение после конца функции. Вы можете установить флаг в aMachine и заставить цикл while работать до тех пор, пока он не будет установлен, а не работать вечно:

в классе "Станок" у вас будет:

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

и вы должны выполнить цикл aMachine.stillRunning () и вызвать aMachine.stopRunning (), чтобы остановить его.

...