Java 无限循环第二次使用扫描仪
我有以下几点:我很清楚,我有一个例外,我必须抓住,如果输入的不是数字,让我疯狂的是,只有在第一次运行时,这个函数才能按预期运行到这一点。当我请求用户输入他们的权重时,它会进入Java 无限循环第二次使用扫描仪,java,loops,while-loop,Java,Loops,While Loop,我有以下几点:我很清楚,我有一个例外,我必须抓住,如果输入的不是数字,让我疯狂的是,只有在第一次运行时,这个函数才能按预期运行到这一点。当我请求用户输入他们的权重时,它会进入上的无限循环,而(!isNum)。我本以为关闭扫描仪,在第二次运行时重新创建对象会创建一个停止点,允许用户输入数据。我正在使用Eclipse Kepler,它是IDE和Java的新手,作为初学者,我正在将其与C#进行比较。请给我一点指导 import java.text.NumberFormat; import java.u
上的无限循环,而(!isNum)
。我本以为关闭扫描仪,在第二次运行时重新创建对象会创建一个停止点,允许用户输入数据。我正在使用Eclipse Kepler,它是IDE和Java的新手,作为初学者,我正在将其与C#进行比较。请给我一点指导
import java.text.NumberFormat;
import java.util.InputMismatchException;
import java.util.Locale;
import java.util.Scanner;
import java.util.regex.MatchResult;
import org.omg.CORBA.DynAnyPackage.TypeMismatch;
public class TheValidator {
private int height;
private int weight;
private boolean isNotValid = true;
private boolean weightIsValid = false;
private Scanner sc;
void inputTest(){
while (!isNotValid);{
System.out.print("Please enter your height in inches.");
numTest();
}
isNotValid = true;
while (!isNotValid);{
System.out.print("Please enter your weight in inches.");
numTest();
}
sc.close();
}
void numTest()
{
// Variable to see if entered data is legit number.
while(isNotValid)
{
boolean isNum = false;
boolean isPos = false;
int num = 0;
while(!isNum)
{
if(sc.hasNextInt())
{
isNum = true;
num = sc.nextInt();
if(num > 0)
{
isPos = true;
}
else
{
System.out.println("You entered a number that is not positive. Please ensure you entered a positive numeric number and try again.");
}
}
else
{
System.out.println("What you entered isn't even a number. Please ensure you entered a positive numeric number and try again.");
}
}
if(isNum && isPos)
{
isNotValid = false;
}
}
}
}
第一个问题是,如果
hasnetint()
为false,则需要采取措施使扫描仪通过非法输入。如果不这样做,扫描仪的光标(指向要查看的下一个输入)将永远保持在同一位置,导致无限循环。如果在hasNextInt()
为false时执行此操作:
sc.nextLine();
这将清除行中的所有其他内容,允许用户输入新的输入
这个修正是不够的;当我添加这个时,我得到了其他的例外,我认为这与您正在为每个输入行打开一个新的
扫描仪有关。这应该没有必要。当创建验证程序时,您可以将sc
初始化为新的扫描仪
;您可能需要在关闭扫描仪的验证器中添加一个close
方法。我想我对验证器的实际操作有点困惑。它讨论了这种方法“使扫描器超过当前行并返回被跳过的输入”。我想我有点困惑。我确实成功地对上面的内容进行了一些修改。在你看来,如果我理解正确的话,ajb nextLine()的行为有点像重置。我想我需要hasNextInt(),因为我用它来验证输入的内容实际上是数字。欣赏pointers@TargetofGravitynextLine()。在很多情况下,您需要检索行的其余部分并使用它。在这里,我没有为结果分配任何内容,这意味着我们只是将其扔掉,但我们真正想要的只是跳过当前行的效果(因此,当我们要求扫描仪获取更多数据时,会迫使用户输入另一行)。