如何防止用户堵塞我的扫描仪?

Posted

技术标签:

【中文标题】如何防止用户堵塞我的扫描仪?【英文标题】: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)将无助于对其进行分类。请务必阅读选择标签时出现的说明! 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

在此处添加:

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

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

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

【讨论】:

以上是关于如何防止用户堵塞我的扫描仪?的主要内容,如果未能解决你的问题,请参考以下文章

防止在 chrome 上“扫描新卡”

哪些方法可以防御黑客的Nmap扫描

如何防止我的用户从 iPod 中删除 MP3 文件

防止媒体扫描,设置权限或锁定android中的文件夹和文件

phonegap 条码扫描仪:如何一次进行多次扫描

如何通过扫描仪将 LocalDate 类型作为参数传递?