防止用户输入相同的元素(在故障尝试捕获中)

时间:2015-06-13 02:10:10

标签: java if-statement arraylist try-catch

所以下面的代码就像一个简单的游戏,其目的是猜测正确的数字(1到5)。其他任何不正确的用户会在输入类似的数字时收到警告信息。会解释声明的循环和变量。

我对这段代码唯一的问题是我插入了一个try catch来处理字符串并且似乎没有用。如果输入一个字符串,while循环将无限延续。

此外,我意识到我的代码中存在循环pf循环和条件语句,但我无法想到其他任何内容。如果您有任何建议来减少循环次数和if语句,那么您的帮助非常感谢。

 public class Tries {
            public static void main(String[]args)
            {


            boolean dataType=false;
            int Inp;
            Scanner a=new Scanner(System.in);
    //The arraylist,List, contains the input that the user enters.Only correct input is entered(1 to 5).
            ArrayList<Integer> List=new ArrayList<Integer>();

    //This determines how many times the for loop is going to execute.Say the user enters 4,and enters 4 correct inputs,the program will exit.The variable num basically determines what the size of the arraylist List is going to be.
                System.out.println("How many tries?");
                int num=a.nextInt();


                boolean datatype=false;

                    for(int j=0;j<num;j++)
                    {
    //This while loop is for the try catch.
                        while(!datatype)
                        {

                        Scanner sc=new Scanner(System.in);

    //This while loop ensures that the user re enters input when anything other than the correct numbers are entered.
                        while(List.size()!=num)
                        {
                            try
                            {
                                System.out.println("\nPick a number: ");
                                Inp=sc.nextInt();

                            if(Inp==1 || Inp==2 || Inp==3 || Inp==4 || Inp==5)
                            {

                                datatype=true;
                                System.out.println(j);

                                if(List.size()==0)
                                {
                                    List.add(Inp);
                                }
                                else if(List.size()>0)
                                {
                                        if(List.contains(Inp))
                                        {
                                            System.out.println("Already entered.Try again.");   
                                        }
                                        else if(!List.contains(Inp))    
                                        {
                                            List.add(Inp);
                                            System.out.println("Added");
                                            dataType=true;

                                            System.out.println(List);
                                        }
                                 }
                            }
                                else
                                {
                                    System.out.println("Option not available.");
                                    datatype=false;
                                }
                             }
                            catch(Exception JavaInputMismatch)
                            {
                                System.out.println("Option not available.Try again.");
                                datatype=false;
                            }
                        }
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

因此,当Inp=sc.nextInt();因用户输入无效数字而失败时,会抛出InputMismatchException。然后再次循环,最终再次尝试运行Inp=sc.nextInt();

但问题是输入的无效数字仍在等待读取的输入流中。因此,在下一个循环中,当再次尝试Inp=sc.nextInt();时,它不会尝试读取新值,它只是读取前一个无效值而不允许您键入任何新内容。而且这种情况一直在无休止地发生。

快速修复?在尝试读取新数据之前,您需要清除输入流以除去无效数字。

在您的sc.next();块中添加catch调用的最简单方法是在您的程序中插入该修补程序:

catch(Exception JavaInputMismatch)
{
    sc.next(); // clear the bad token. Without this, it loops infinitely.
    System.out.println("Option not available.Try again.");
    datatype=false;
}

我会对该计划做出一些其他的改变/改进,但我承认我目前缺乏解决这些问题的动力。希望这至少可以阻止你。

修改 我想我可以添加一些可以帮助你的高级建议:

  • 正如已经评论过的那样,您不应该从Scanner读取2 System.in个实例。
  • 我建议删除整个try-catch以检测无效的号码,而是在使用sc.hasNextInt()读取号码之前使用sc.nextInt()进行检查。即使您确实保留了catch阻止,我也建议您尽可能具体说明异常类型(例如catch(InputMismatchException e)),而不是全部Exception。否则,您冒着抓住无关异常并以错误方式处理它们的风险。
  • 您应该能够删除datatype布尔变量及其关联的循环。只要您的列表未满,就足以循环。
  • 事实上,如果我正确地理解了这一点,你可以通过仅保留while(List.size()!=num)的循环来简化你的循环。我认为你可以安全地摆脱for(int j=0;j<num;j++)
  • 的循环
  • 次要细节,但您可以更简洁地表达if(Inp==1 || Inp==2 || Inp==3 || Inp==4 || Inp==5)if(Inp >= 1 && Inp <= 5)
  • 最后,确定是否将数字添加到列表的逻辑不需要根据列表的大小执行一系列条件。

这样的事情就足够了:

if (List.contains(Inp)) {
    System.out.println("Already entered.Try again.");
} else {
    List.add(Inp);
    System.out.println("Added");
    System.out.println(List);
}

我希望这会有所帮助。