Java 为什么这行要打印多次?

Java 为什么这行要打印多次?,java,while-loop,Java,While Loop,我想打印一行“输入字符:,然后获取输入字符并分配它,然后继续重复,直到输入了-或?。但是,“输入字符:”在最初打印一次后,在第一次输入后打印多次。输入'?'或'-'也不会退出循环 方法如下: private void runPrompt() { Deque<Character> first = new Deque<Character>(); Deque<Character> second = new Deque<Character

我想打印一行
“输入字符:
,然后获取输入字符并分配它,然后继续重复,直到输入了
-
。但是,
“输入字符:”
在最初打印一次后,在第一次输入后打印多次。输入
'?'
'-'
也不会退出循环

方法如下:

    private void runPrompt() {
    Deque<Character> first = new Deque<Character>();
    Deque<Character> second = new Deque<Character>();
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            System.in));
    char userChar = 0;
    int firstWord = 0;
    int secondWord = 0;
    boolean isMinus = false;
    while (!isMinus) {
        System.out.print("Enter character: ");
        try {
            userChar = (char) reader.read();
            System.out.println(userChar);
            first.enqueue(userChar);
            firstWord++;
            if (userChar == '-') {
                isMinus = true;
            }
        } catch (QueueException e) {
            System.out.println(e.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if (isMinus) {
        while (userChar != '?') {
            System.out.print("Enter character: ");
            try {
                userChar = (char) reader.read();
                System.out.println(userChar);
                second.enqueue(userChar);
                secondWord++;
            } catch (QueueException e) {
                System.out.println(e.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    switch (checkLength(firstWord, secondWord, isMinus)) {
    case 0:
        System.out.print("\t>>Same length, ");
        if (checkContent(first, second)) {
            System.out.print("Same content, ");
            if (checkPalindrome(first, firstWord)) {
                System.out.println("Palindrome");
            }
        } else {
            System.out.println("Different content, no Palindrome");
        }
        break;

    case 1:
        System.out
                .println("\t>>Left longer, different content, no Palindrome");
        break;

    case 2:
        System.out
                .println("\t>>Right longer, different content, no Palindrome");
        break;

    case 3:
        System.out.println("\t>>No minus");

    default:
        break;
    }
}

由于它一个字符一个字符地读取,所以它实际上读取r,然后是回车符(CR),最后是换行符(LF)。您可以打印该值并亲自查看:

System.out.println((int)userChar);

它显示了我提到的字符的UTF-16代码单位值。因此,对于每个输入,循环将再执行两次。然后它返回并等待下一个输入-这就是为什么总共有四个
Enter character:
语句可见的原因。您可以使用类似于
readLine().charAt(0)
的方法来避免这种情况。可能有某种方法可以刷新缓冲区中挂起的输入,但我现在不回忆它

如果(userChar='-'){isMinus=true;}应写入
isMinus=userChar='-'),则使用
readLine()读取单行后清除缓冲区
@JarrodRoberson我使用
.equalsIgnoreCase()
谢谢,这是固定的。Java字符串、字符和字符使用Unicode/UTF-16,所以不用ASCII,而是说UTF-16代码单位值。(+1)谢谢,可以!
System.out.println((int)userChar);