天天看点

JAVA Scanner常见的自动赋值问题和造成死循环问题。

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();扫描到了原来空格以后的值直接就拿来用了。

JAVA Scanner常见的自动赋值问题和造成死循环问题。

如图此时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运行机制,在此做个笔记。