2016-02-27 3 views
1

Я работаю через «Java-руководство для новичков, шестое издание» Герберта Шильдта.Ошибка вывода на выходе Loop Loop

Использование Windows 7 Home Premium 64-бит с Java 1.8.0_73 в Windows Powershell.

Когда я компилирую это упражнение (без предупреждений компилятора или ошибок бы то ни было):

class DoWhileDemo { 
    public static void main(String[] args) 
    throws java.io.IOException { 
     char ch; 

     do { 
      System.out.print("Press a key followed by ENTER: "); 
      ch = (char) System.in.read(); 
     } while(ch != 'q'); 
    } 
} 

Когда я запускаю его с «Java DoWhileDemo» я получаю

Press a key followed by ENTER: f 
Press a key followed by ENTER: Press a key followed by ENTER: Press a key followed by ENTER: q 

программа выходит, как и ожидалось (при Я нажимаю «q» и нажимаю ENTER), но многократные распечатки «Нажмите клавишу« после ENTER »:« нет ».

Любые идеи, почему это происходит?

ответ

1

Заявление

ch = (char) System.in.read(); 

читает в одного характера. Когда пользователь нажимает q и enter, три символа посылают в ваш код:

q 
\r 
\n 

в системе Windows. Таким образом, вы получаете еще два paasses через цикл, прежде чем ничего не будет в очереди ввода, и ваш код перестанет читать.

В Linux вы увидите только одно дополнительное приглашение, так как в этом случае отправляются только два символа (q\n).

Если вы хотите обработать целые строки (как вы видите, вы делаете), вы должны обернуть System.in в BufferedReader, чтобы вы могли позвонить readLine().

+0

Забавно, вы ответили то же самое на дублирующий вопрос;). – Tunaki

+0

18 месяцев назад ... Я не помню этого :-) –

-1

Это происходит потому, что при нажатии f, что означает, что она не равна q так условие истинно и цикл выполнения снова и снова при нажатии q условие становится ложным и петлями выезды с

+0

Это вводит в заблуждение. И старайтесь избегать публикации такого вводящего в заблуждение ответа _after_, он закрыт как дубликат гораздо лучшего ответа ... – Tunaki