Java,while while循环在再次请求输入之前运行两次

时间:2014-04-10 05:38:20

标签: java spring while-loop do-while system.in

我只是在磨练我的java技能,并且我写了这个代码来玩键盘输入和while循环。

package Chapter3;

import java.io.IOException;

public class convertCase {

public static void main(String args[]) throws IOException {
    char ch = 'a';

    do {
        System.out.println("please type in a value: ");
        ch = (char) System.in.read();

        if((int) ch < 96) {
            ch += 32;
            int newCh = (int) ch;
            System.out.println("The lowercase version is: " + (char)newCh);
        }

        else if((int) ch >96) {
            System.out.println("You have typed in" + ch);
            ch -= 32;
            int newCh = (int) ch;
            System.out.println("the uppercase version is: " + (char)newCh);
        }
    } while(ch!='.');
}

}

问题在于,当我测试它时,'while循环'在请求输入之前运行两次而不是仅仅一次:

please type in a value: 
a
You have typed ina
the uppercase version is: A
please type in a value: 
The lowercase version is: *
please type in a value: 
L
The lowercase version is: l
please type in a value: 
The lowercase version is: *
please type in a value: 

有人能否澄清这种情况?

4 个答案:

答案 0 :(得分:3)

那是因为

System.in.read();

接受按下的每个键。也就是说,在你的情况下,&#39; a&#39;关键,并且“返回”&#39;键。

如果您需要您的功能,请使用以下内容:

Scanner scanner = new Scanner(System.in);

然后使用:

String line =(char)scanner.nextLine();

然后解析值。

答案 1 :(得分:2)

您正在处理换行符,就好像它是合法输入一样。您应该读取整行(包括换行符,可能使用Scanner),然后处理该行的第一个字符,或者只是添加一个测试以跳过循环逻辑中的换行符。

P.S。通过添加或减去32来转换案例是一种非常糟糕的方法。除了a-z和A-Z(英文字母)之外,它不会使用任何东西。它不适用于Basic Latin块之外的大多数字符,并且不应该用于没有备用情况的字符(例如换行符)。您应该使用Character.toUpperCase()Character.toLowerCase()代替。

答案 2 :(得分:2)

它循环两次,因为它正在处理每个字符后面的换行符。

答案 3 :(得分:1)

答案取自Book&#34; Java:初学者指南&#34;

上面提到的答案也是正确的。为了进一步说明,我将发布此信息。

do {
        System.out.print("Pres a key followed by Enter: ");
        //get a char
        ch = (char) System.in.read(); 

        //REFERRING TO THIS PART
        do{
            ignoreNewLineENTER = (char) System.in.read();
        }
        while (ignoreNewLineENTER != '\n');

} while (ch != 'q');

控制台输入是行缓冲的 - 你必须在发送字符之前按ENTER键。按ENTER键将生成回车符和换行符(换行符)序列。这些字符在输入缓冲区中保持挂起状态。此外,如果在按ENTER之前键入多个键,它们仍然会在输入缓冲区中。此循环通过继续读取输入直到到达行的末尾来丢弃这些字符。如果它们没有被丢弃,那么这些字符也将作为猜测发送到程序,这不是想要的。 (要查看其效果,您可以尝试删除内部执行循环。)在第10章中,在您了解了有关Java的更多信息之后,将介绍一些其他更高级别的处理控制台输入的方法。但是,在这里使用read()可以让您深入了解Java I / O系统的基础如何运作。它还显示了Java循环的另一个例子。