这是一些示例代码:
import java.util.Scanner; class In { public static void main (String[]arg) { Scanner in = new Scanner (System.in) ; System.out.println ("how many are invading?") ; int a = in.nextInt() ; System.out.println (a) ; } }
如果我运行该程序并将其设置为int like 4,则一切正常。
int
4
另一方面,如果我回答,too many那不会嘲笑我的有趣笑话。相反,我得到这个(如预期的那样):
too many
Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:819) at java.util.Scanner.next(Scanner.java:1431) at java.util.Scanner.nextInt(Scanner.java:2040) at java.util.Scanner.nextInt(Scanner.java:2000) at In.main(In.java:9)
有没有一种方法可以使它忽略不是int的条目,或者用“有多少个入侵者”重新提示?我想知道这两种方法。
你可以使用的诸多一个hasNext*是方法Scanner有预验证。
hasNext*
Scanner
if (in.hasNextInt()) { int a = in.nextInt() ; System.out.println(a); } else { System.out.println("Sorry, couldn't understand you!"); }
这可以防止InputMismatchException从甚至被抛出,因为你总是确保它WILL你读它之前匹配。
InputMismatchException
java.util.Scanner API
boolean hasNextInt():返回true是否可以使用nextInt()方法将此扫描器输入中的下一个标记解释为默认基数中的int值。扫描仪不会越过任何输入。
boolean hasNextInt()
true
nextInt()
String nextLine():使此扫描仪前进到当前行,并返回跳过的输入。
String nextLine()
请记住以粗体显示的部分。hasNextInt()不会超过任何输入。如果返回true,你可以通过调用来推进扫描程序nextInt(),不会抛出异常InputMismatchException。
hasNextInt()
如果返回false,则需要跳过“垃圾”。最简单的方法是调用nextLine(),可能两次,但至少一次。
false
nextLine()
为什么你可能需要做nextLine()两次以下操作:假设这是输入的内容:
42[enter] too many![enter] 0[enter]
假设扫描仪位于该输入的开头。
[enter]
"too many!"
Scanner in = new Scanner (System.in) ; System.out.println("Age?"); while (!in.hasNextInt()) { in.next(); // What happens if you use nextLine() instead? } int age = in.nextInt(); in.nextLine(); // What happens if you remove this statement? System.out.println("Name?"); String name = in.nextLine(); System.out.format("[%s] is %d years old", name, age);
假设输入为:
He is probably close to 100 now...[enter] Elvis, of course[enter]
然后输出的最后一行是:
[Elvis, of course] is 100 years old