java中的输入扫描器不工作

c2e8gylq  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(386)

我正在尝试编写一个非常简单的数字猜测游戏(代码如下)。在一轮结束后,用户应该能够决定他/她是否想玩另一轮。问题是,程序总是跳过最后一个问题(从不让用户回答“y”或其他问题)。我错过了什么?有什么事吗 java.util.Scanner 我不知道什么?

import java.util.Random;
import java.util.Scanner;

public class GuessNum {

public GuessNum() {         

        int numRandom = 0;    
        int numGuess;    
        int life = 5;    
        String want = "";    
        Random rand = new Random();    
        Scanner scan = new Scanner(System.in);

        do {
            int lifeLeft = 5;
            numRandom = rand.nextInt(9)+1;

            System.out.print("\nGuess the Number [1..10]\n");
            System.out.print("===================\n");
            System.out.print("You have " + lifeLeft + " chances.\n");

            do {
                do {
                    System.out.print("What number do I have in mind: ");
                    numGuess = scan.nextInt();

                    if (numGuess < 1 || numGuess > 10)    
                        System.out.println("Invalid input. Range is 1-10.");    
                } while (numGuess < 1 || numGuess > 10);

                if (numGuess != numRandom && lifeLeft != 0)
                    System.out.println("Wrong! You only have " + --lifeLeft + " chances left.");

            } while (numGuess!=numRandom && lifeLeft > 0);

            if (numGuess == numRandom)
                System.out.println("Correct! -- in " + (life - lifeLeft) + " guess(es).");

            if (lifeLeft == 0) {
                System.out.println("You have no more lives..");
                System.out.println("This is the number: " + numRandom);
            }

            System.out.print("\nEnter 'y' if you want to play again or any other character to exit: ");
                want = scan.nextLine();
        } while (want.equals("y") || want.equals("Y"));
    }

    public static void main(String[] args) {            
        new GuessNum();
    }
}
b09cbbtk

b09cbbtk1#

使用 want = scan.next(); 而不是 nextLine() .
你的问题的原因是 nextInt() ,你还在同一条线上,而且 nextLine() 返回当前行的其余部分。
下面是一个最小的片段来重现这种行为:

Scanner sc = new Scanner(System.in);
System.out.println("nextInt() = " + sc.nextInt());
System.out.println("nextLine() = " + sc.nextLine());

当你输入时, 5 然后按回车键,输出为:

nextInt() = 5
nextLine() =

也就是说, nextLine() 没有为您的输入阻止,因为当前行仍有一个空字符串。
作为比较,当你输入时,说 5 yeah! 然后按enter,则输出为:

nextInt() = 5
nextLine() =  yeah!

请注意 " yeah!" 实际上来自同一行 5 . 这与文件中的规定完全一致: String nextLine() :使扫描器超过当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。

半开范围

假设要猜测的数字介于1和10之间(含1和10),则以下代码为“错误”:

numRandom = rand.nextInt(9)+1; // this can only be in 1..9 range inclusive!

以下是一个摘录自 java.util.Random : int nextInt(int n) :返回一个伪随机、均匀分布的int值,该值介于0(包括0)和指定的值(不包括0)之间
也就是说,就像java的api中的很多方法一样, Random.nextInt(int) 使用半开范围,包含下限和排除上限。

相关问题

索引范围的上界是否总是假定为独占的?

68bkxrlz

68bkxrlz2#

使用 scan.next()+ scan.nextLine(); 相反,例如。

Scanner scan = new Scanner(System.in);

String s = scan.nextLine() +scan.nextLine();

发生此问题的原因是,最后一行输入的最后一个换行符仍在输入缓冲区和下一个缓冲区中排队 nextLine() 将读取行的其余部分(为空)。因此,当您使用next时,它会转到下一个标记,然后您可以使用 nextLine()

相关问题