Входные данные сканера добавляются в текстовый файл, несмотря на условие цикла while

У меня есть небольшое небольшое Java-приложение, которое при выполнении терминала принимает строковые данные и сохраняет эти строки в текстовом файле. У меня есть строка exit это побудит приложение выйти. Однако по какой-то причине строка exit добавляется к документу, несмотря на то, что while(!) петля. В чем может быть проблема?

try{
            Scanner scanner = new Scanner(System.in);
            String input = null;
            while(!"exit".equalsIgnoreCase(input)){
                input = scanner.nextLine();
                String fileLocation = "/Users/myName/Dropbox/myDocument.txt";
                FileWriter writer = new FileWriter(fileLocation,true);

                writer.append(returnDate()+": ");
                writer.append(input + "\n");

                writer.flush();
                writer.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }

1 ответ

Решение

Следуйте вашему коду мысленно. Вы выполняете всю обработку в цикле до того, как условие цикла while будет оценено в следующий раз.

У тебя есть:

while(!"exit".equalsIgnoreCase(input)){
    input = scanner.nextLine(); 
    ...
    writer.append(input + "\n");
    ...
}

Предполагая, что пользователь вводит "выход" в качестве первой команды, поток выглядит так:

  1. input является null первоначально.
  2. while условие успешно.
  3. input прочитано, теперь это "выход".
  4. inputто есть "выход", записывается в файл.
  5. while цикл перезапускается, условие оценивается, происходит сбой, цикл не выполняется снова.

Обратите внимание, что "выход" был записан в файл.

Вам придется немного переработать логику, чтобы убедиться, что запись в файл не происходит. Это не редкий тип ситуации. Есть много решений в зависимости от ваших предпочтений. Вы можете объединить назначение и сравнение в while заявление:

while (!"exit".equalsIgnoreCase(input = scanner.nextLine())) {
    write input;
}

Вы можете иметь избыточную проверку (не имеет смысла для вашего простого примера, а также часто указывает место для общего улучшения логики):

while (input is not exit) { 
    read input;
    if (input is not exit) write input;
}

Вы не могли бы использовать условие цикла вообще:

while (true) {
    read input; 
    if (input is exit) break;
    write input;
}

Есть много способов это исправить.

Другие вопросы по тегам