【问题标题】:Scanner in Java not workingJava中的扫描仪不起作用
【发布时间】:2010-07-13 11:51:16
【问题描述】:

我正在尝试编写一个非常简单的猜数字游戏(代码如下)。一轮结束后,用户应该能够决定他/她是否想再打一轮。问题是,程序总是跳过最后一个问题(从不让用户回答“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();
    }
}

【问题讨论】:

  • 在十年来抱怨从控制台简单地获取一点输入是多么困难之后,Sun 为我们提供了Scanner 类,以便“Java 入门”文本可以编写简洁的示例。但是Scanner 远非万无一失。我通常会不厌其烦地通过BufferedReader 等显式读取和扫描行。
  • 有关使用 Scanner 和验证输入(例如整数、仅元音等)的更多信息,请参阅:stackoverflow.com/questions/3059333/…

标签: java input java.util.scanner


【解决方案1】:

使用want = scan.next(); 而不是nextLine()

您的问题的原因是在前面的nextInt() 之后,您仍然在同一行,nextLine() 返回当前行的其余部分。

这是重现该行为的最小 sn-p:

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):返回一个伪随机、均匀分布的 int 值,介于 0(包括)和指定值(不包括)之间

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

相关问题

【讨论】:

  • 啊,谢谢(也为随机生成器更正)!我认为 nextLine() 默认从新行开始。下次应该多注意文档。
【解决方案2】:

请改用scan.next()+ scan.nextLine(); 例如。

Scanner scan = new Scanner(System.in);

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

出现问题是因为最后一行输入的最后一个换行符仍在输入缓冲区中排队,而下一个nextLine() 将读取该行的剩余部分(为空)。 因此,当您使用 next 时,它会转到下一个令牌,然后您可以使用 nextLine() 获取剩余的输入

【讨论】:

  • 为什么不scan.nextLine()
  • 谢谢它的工作!为什么 scan.nextLine() + scan.nextLine();这仅仅是因为我的情况是一样的,因为我得到的输出是空字符串而不是一堆单词/字符串,这样做会获取初始的空字符串并将其与实际的字符串连接起来。
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
相关资源
最近更新 更多