新程序员在这里。这可能是一个非常基本的问题,但它仍然困扰着我。
我要做的是编写一个只提供一个整数输入的方法,这样我就可以在主程序中使用该输入,而不必使用非整数输入。然而,即使用自己的方法编写方法也是有问题的。
public static int goodInput () {
Scanner input = new Scanner (System.in); //construct scanner
boolean test = input.hasNextInt(); //set a sentinel value
while (test == false) { //enter a loop until I actually get an integer
System.out.println("Integers only please"); //tell user to give me an integer
test = input.hasNextInt(); //get new input, see if it's an integer
}
int finalInput = input.nextInt(); //once i have an integer, set it to a variable
input.close(); //closing scanner
return finalInput; //return my integer so I don't have to mess around with hasNextInt over there
}
这似乎在多个级别被打破,但我不确定为什么。
如果我在第一次要求输入时输入0或1之类的整数值,它应该完全跳过循环。但是,相反,它进入循环,并打印“仅请整数”。更糟糕的是,当我在那里时,它实际上并没有要求输入,只是反复打印该行。
我理解后一个问题可能是由于令牌问题,但我不一定确定如何解决它们;关闭然后重新打开扫描程序会让Eclipse错过“重复对象”,简单地将旧输入分配给垃圾字符串变量从未使用过,告诉我“在运行时没有找到行”,而且我没有足够的经验想一想获得新意见的其他方法。
即使一旦解决了,我也需要找到一些方法来避免在有整数的情况下进入循环。我真的不明白为什么整数输入在循环之间开始,所以我不确定这是怎么可能的。
请帮帮忙?对不起,如果这是一个老问题;试着看过去的问题,但似乎没有一个问题与我有相同的问题。
答案 0 :(得分:3)
你很亲密:这对我来说很好:
Scanner input = new Scanner(System.in); //construct scanner
while(!input.hasNextInt()) {
input.next(); // next input is not an int, so consume it and move on
}
int finalInput = input.nextInt();
input.close(); //closing scanner
System.out.println("finalInput: " + finalInput);
通过在while循环中调用input.next()
,您将使用非整数内容并再次尝试,直到下一个输入为int。
答案 1 :(得分:0)
//while (test == false) { // Line #1
while (!test) { /* Better notation */ // Line #2
System.out.println("Integers only please"); // Line #3
test = input.hasNextInt(); // Line #4
} // Line #5
问题在于,在上面的第4行中,input.hasNextInt()
仅测试是否输入了整数,并且不要求新的整数。如果用户输入的内容其他而不是整数,hasNextInt()
会返回false
而您无法请求nextInt()
,因为这会引发InputMismatchException
,因为Scanner
仍然期望一个整数。
您必须使用next()
代替nextInt()
:
while (!input.hasNextInt()) {
input.next();
// That will 'consume' the result, but doesn't use it.
}
int result = input.nextInt();
input.close();
return result;