所以下面的代码就像一个简单的游戏,其目的是猜测正确的数字(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;
}
}
}
}
}
}
答案 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);
}
我希望这会有所帮助。