【问题标题】:How do I prevent the user from clogging up my Scanner?如何防止用户堵塞我的扫描仪?
【发布时间】:2014-04-25 11:39:59
【问题描述】:

我正在编写一个简单的抛硬币游戏。前提很简单:用户可以正面或反面。然后计算机掷硬币,告知用户掷硬币的结果,以及他们是否猜对了。

就代码而言,在 while 循环中,我首先提示用户输入,我使用我的 Scanner 的 nextLine() 读取该输入,然后将其分配给 String 变量。然后我调用 feedback(),它在终端窗口显示“处理中”并调用当前正在执行的线程的 sleep()。然后我检查他们的猜测,如果由于某种原因它无效,我会在终端窗口中显示一条适当的消息并将布尔值设置为 true。这个布尔值的真实性是使 while 循环能够继续运行的原因。我不满意的是,在 while 循环中,当我读到他们对 String 的猜测并且在执行 feedback() 时,我仍然可以输入内容并按 Enter。然后,在接下来的几次循环中(假设标志在某些时候设置为真),它使用我输入的内容进行赋值 input = reader.nextLine()。我很惊讶。我认为当调用 nextLine() 时,扫描器只会读取一行输入,直到下一次调用 nextLine() (即下一次通过循环)。但相反,它似乎跟踪了在执行反馈()时输入= reader.nextLine()之后输入的所有行。这是我的问题:有没有办法让扫描器只读取一行并让它忽略用户输入的任何其他内容,直到你下次真正提示他们输入?换句话说,通过防止用户输入阻塞扫描器并占用while循环数次的不需要的输入来使游戏变得万无一失?以下是我的游戏的完整实现:​​

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

public class GuessingGame
{
    public static void main( String[] args ) throws InterruptedException
    {
        Random randy = new Random();
        Scanner reader = new Scanner( System.in );
        String input = "";
        int guess = 0; 
        boolean flag = true;

        System.out.println("Let's flip a coin!");

        while( flag )
        {
            flag = false;
            System.out.println("\fEnter 1 for heads, 2 for tails.");
            input = reader.nextLine();
            feedback("Processing");

            try
            {
                guess = Integer.parseInt( input );
            }
            catch( NumberFormatException e )
            {
                flag = true;
                System.out.println("Invalid!");
                Thread.sleep(3000);
            }

            if( !flag )
            {
                try
                {
                    receive( guess );
                }
                catch( IllegalArgumentException e )
                {
                    flag = true;
                    System.out.println( e );
                    Thread.sleep(3000);
                }
            }
        }

        feedback("Flipping");
        int outcome = randy.nextInt(2) + 1;

        if( outcome == 1 )
        {
            System.out.print("Heads! ");

            if( guess == 1 )
            {
                System.out.println("You guessed correctly.");
            }
            else
            {
                System.out.println("You guessed incorrectly.");
            }
        }
        else
        {
            System.out.print("Tails! ");

            if( guess == 2 )
            {
                System.out.println("You guessed correctly.");
            }
            else
            {
                System.out.println("You guessed incorrectly.");
            }
        }
    }

    public static void receive( int g )
    {
        if( g < 0 || g > 2 )
        {
            throw new IllegalArgumentException("Guess must be 1 or 2.");
        }
    }

    public static void feedback( String message ) throws InterruptedException
    {
        String feedback = message;
        System.out.println("\f");

        for( int x = 0; x < 12; x++ )
        {
            if( x % 4 == 0 )
            {
                feedback = message;
                Thread.sleep(250);
            }

            System.out.println("\f" + feedback );
            feedback += ".";
            Thread.sleep(125);
        }

        System.out.print("\f");
    }
}

【问题讨论】:

  • 请注意标签不是关键字。在标签列表中塞满与您的问题相同的单词(clog、scanner)将无助于对其进行分类。请务必阅读选择标签时出现的说明!

标签: java while-loop java.util.scanner


【解决方案1】:

最简单的方法就是在您发布问题时阅读并丢弃扫描仪中的任何内容。扫描器可能有一种方法来清除它或寻找到最后作为替代方法来做同样的事情。

【讨论】:

    【解决方案2】:

    您应该在使用完扫描仪后致电reader.close()

    在此处添加:

            try
            {
                guess = Integer.parseInt( input );
                reader.close();
            }
    

    如果输入被正确解析,这将关闭扫描器并阻止用户进行进一步的交互。如果Integer.parseInt(input) 抛出异常,该行将不会被执行。

    关闭扫描器和其他读取器/写入器是一种很好的做法,因为它会将内存释放回系统并防止像您的程序那样发生事故。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 2015-10-02
      相关资源
      最近更新 更多