该方法应该返回用户输入的整数,只要它只是一个整数(不是String,float等),并且只要该整数是给定选项列表中的选项之一。每当我向用户提供他们需要选择的选项列表时,我想在整个程序中使用此方法。这些列表将具有不同的大小,因此我将参数作为参数传递给用户可能选择的最大值(maxValue),从而为该方法提供列表大小。
//This method handles the players input and checks if the number entered is one of the options listed or not
public static int response(int maxValue){ //the parameter is the number of options in the particular list
response = new Scanner(System.in);
Boolean check = true;
while(check){
try{
int yesOrNo = response.nextInt();
if(yesOrNo > maxValue || yesOrNo <= 0){ //checks if the int entered does not exceed the list size or go below zero
System.out.println("I'm sorry, that number was not one of the options. Please reselect your choice.");
}else{
check = false;
}
}catch(Exception e){ //catches an exception when the user enters a string or anything but an int
System.out.println("Please only use digits to make a selection.");
response(maxValue);
}
}
return yesOrNo; //returns the user's response. Well, it is supposed to.
}
我是编程方面的初学者。我正在通过在线教程学习Java,并在我做的愚蠢的小程序上试错。我正在进行一个有趣的小文本冒险,我还处于开始阶段。
我遇到的麻烦是因为此方法只返回0.是否yesOrNo
被分配了用户通过扫描程序response
输入的整数?为什么它只返回0?
感谢您的回复。我现在明白了,我需要在int yesOrNo
之外声明我的try
,因为它超出了范围,正如你所说的那样,被宣布在内。
但是有一些提到&#39;在catch块中有一个完全不必要的函数调用&#39;。唯一的问题是如果我删除它,当用户输入字符串或其他非int值时,使用System.out.println("Please only use digits to make your selection.")
创建了一个无限循环。
这是我更新的代码:
//This method handles the players input and checks if the number entered is one of the options listed or not
public static int response(int maxValue){ //the parameter is the number of options in the particular list
response = new Scanner(System.in);
Boolean check = true;
int yesOrNo = 0;
while(check){
try{
yesOrNo = response.nextInt();
if(yesOrNo > maxValue || yesOrNo <= 0){ //checks if the int entered does not exceed the list size or go below zero
System.out.println("I'm sorry, that number was not one of the options. Please reselect your choice.");
}else{
check = false;
}
}catch(Exception e){ //catches an exception when the user enters a string or anything but an int
System.out.println("Please only use digits to make a selection.");
response(maxValue);
}
}
return yesOrNo; //returns the user's response. Well, it is supposed to.
}
在阅读其他帖子之后,在发出另一个问题之前,我发现许多其他人面临同样的问题。有些人说无限循环被创建是正确的,因为当扫描程序遇到错误时它不会删除该错误的标记,从而导致while循环无限地再次读取相同的错误。这是我读到的内容:
&#34;根据扫描仪的javadoc:
&#39;当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过它。&#39;
这意味着如果下一个标记不是int,它会抛出InputMismatchException,但标记会保留在那里。因此,在循环的下一次迭代中,getAnswer.nextInt()再次读取相同的标记并再次抛出异常。你需要的是用它。在catch中添加一个getAnswer.next()来使用令牌,该令牌无效且需要丢弃。&#34;
所以现在已经修复了无限循环问题:)找到我需要学习的其他内容。谢谢。
答案 0 :(得分:2)
yesOrNo
超出范围,因为您在try块中声明了它。返回时,将声明移到范围内。
Boolean check = true;
int yesOrNo;
答案 1 :(得分:0)
yesOrNo
您返回的内容与
int yesOrNo = response.nextInt();
你的循环中的。循环中的yesOrNo在}
的结束try
处消失(超出范围)。
某处必须有另一个int yesOrNo
。寻找它。
答案 2 :(得分:0)
唯一可以编译的是yesOrNo
被声明为类或实例变量,在此代码段中看不见。
我们看到的yesOrNo
声明在try
块内声明,隐藏了返回的yesOrNo
。但是它没有理由成为类或实例变量。
从类声明中删除它,并在try
块之前在本地声明它,所以当它返回时它在范围内。
int yesOrNo = 0;
try{
yesOrNo = response.nextInt();
答案 3 :(得分:0)
我看到&#34; int yesOrNo&#34;在循环中。在循环范围内读取的值仅限于此。在外面声明该变量并尝试。