Входные данные сканера добавляются в текстовый файл, несмотря на условие цикла 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");
...
}
Предполагая, что пользователь вводит "выход" в качестве первой команды, поток выглядит так:
input
являетсяnull
первоначально.while
условие успешно.input
прочитано, теперь это "выход".input
то есть "выход", записывается в файл.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;
}
Есть много способов это исправить.