Java中的扫描仪无法正常工作

时间:2010-07-13 11:51:16

标签: java input java.util.scanner

我正在尝试编写一个非常简单的猜数游戏(代码如下)。在完成1轮之后,用户应该能够决定他/她是否想要进行另一轮比赛。问题是,程序总是会跳过最后一个问题(永远不要让用户回答'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();
    }
}

2 个答案:

答案 0 :(得分:11)

使用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然后点击 Enter 时,输出为:

nextInt() = 5
nextLine() = 

也就是说,nextLine()没有阻止您的输入,因为当前行仍然有一个空字符串。

为了进行比较,当您输入时,请说5 yeah!然后按 Enter ,然后输出为:

nextInt() = 5
nextLine() =  yeah!

请注意," yeah!"实际上来自与5相同的行。这与文档中指定的完全相同:

  

String nextLine():使此扫描程序超过当前行并返回跳过的输入。 此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。


在半开范围

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

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

以下摘自java.util.Random的文档:

  

int nextInt(int n):返回伪随机,在0(包括)和指定值(不包括)之间均匀分布的int值

也就是说,就像Java API中的许多方法一样,Random.nextInt(int)使用半开放范围,包含下限和独占上限。

相关问题

答案 1 :(得分:1)

请改用if (SystemOfMeasure.equals("M")) { IdealWeight = Height * Height * 25; lblDisplay.setText(Name + ("'s ideal weight is") + IdealWeight); }   例如

if(SystemOfMeasure == 1) { 
 //do this
}

出现问题是因为最后一行输入的最后一个换行符仍在输入缓冲区中排队,而下一个scan.next()+ scan.nextLine();将读取该行的剩余部分(为空)。 因此,当您使用next时,它转到下一个标记,然后您可以使用Scanner scan = new Scanner(System.in); String s = scan.nextLine() +scan.nextLine();

获取剩余的输入