JAVA在使用我们经常使用的Scanner如下:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入a:");
int a=input.nextInt();
System.out.println("请输入b:");
int b=input.nextInt();
System.out.println("a="+a);
System.out.println("b="+b);
}
}
我们一般想要的是先输入b然后输入a,但是如果此时我们第一次输入a的时候出现了空格或者tab的时候,我们将没有输入b的机会。第一个nextInt();直接会将空格前一部分输入内容扫描进a(此时next方法并没有扫描到空格以后的值),当运行到第二个nextInt();时会先检查Scanner的实列input缓存中有没有内容,有内容的话将不会要求输入。此时第二个next();扫描到了原来空格以后的值直接就拿来用了。

如图此时b将直接被456赋值。
还有以下代码造成的死循环
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
boolean flag=true;
int a=0;
do {
try {
System.out.println("请输入a:");
a=input.nextInt(); //先检测input对象中是否有数据缓存,有的话就不用输入,然后进行类型匹配,此时如果是字符将无法扫描,报错跳到 catch
} catch (Exception e) {
//catch捕捉到错误将flag赋值false想要让程序重新执行。
System.out.println("您输入的不是数字!");
flag=false;
}
}while(!flag);
System.out.println("a="+a);
}
}
如果输入的不是数字,将会造成循环,上课的时候老师说是Scanner缓存的问题,其实也确实是这样。因为是菜鸟所以找了些资料,发现之所以造成死循环是因为如同代码注释所说当nextInt();发现Scanner实例input中不是整数的时候将无法扫描,然后有catch语句重新执行,再次到nextInt();扫描时因为之前的input中非整型缓存还没有被扫描,所以不会提示用户输入,而是准备直接扫描,类型匹配时又发现类型不匹配,所以又重新回到catch循环。
因为弄清这个问题而了解到了Scanner运行机制,在此做个笔记。