关于Scanner中nextInt()、nextLine()等方法总结与问题解决
作者:柠心语冰
Scanner.next?() 方法介绍
Scanner.next?() 有很多种方法,具体名称与内容可以见下表格:
关于Scanner.next?() 的输入问题与分析
让我们先来用代码直观地感受一下使用scanner时经常出现的问题:
Scanner scanner = new Scanner(System.in); System.out.printf("请输入你的名字: "); String name = scanner.nextLine(); System.out.printf("请输入你的出生年份 : "); int age = scanner.nextInt(); System.out.printf("请输入你喜欢的花 : "); String nan = scanner.nextLine(); System.out.printf( "你的名字是: " +name+ "%n 你的出生年份是 :" +age+ "%n 你喜欢的花是 :" +nan );
乍一看,没有什么问题,就是三个简单的输入与读取。但是让我们来看看结果输出:
请输入你的名字: asd
请输入你的出生年份 12
请输入你喜欢的花 : 你的名字是: asd
你的出生年份是 :12
你喜欢的花是 :
Process finished with exit code 0
很明显,最后一个在还没有来得及输入的情况下,直接执行了输出程序,然后结束了整个程序。
这是为什么呢?
这就涉及到上边表格中提到的Scanner.next?()方法结束接收条件。我们在重复使用Scanner的时候,其实是在向同一个缓存区内输入数据,而所谓结束接收条件其实就是不同的“断句符号”。让我们来快速地看一个例子与图解加深一下理解。
Scanner scanner = new Scanner(System.in); String name = scanner.nextLine(); String age = scanner.nextLine(); String nan = scanner.nextLine(); System.out.printf( "name: " +name+ "%n age: " +age+ "%n nan: " +nan );
结果输出:
12
23
21
name: 12
age: 23
nan: 21
Process finished with exit code 0
此时缓存区里内容是:12\n23\n21\n 。而这三个数字为什么会被精准的分配到变量name、age、nan中呢?就是因为scanner.nextLine();函数的结束接收条件为\n。这个函数可以在接收到键盘输出\n后停止接收,运行下一个程序。而\n正是我们在日常程序中进入下一个输入时按的回车。
同理可得,上面那个程序如果正常输入的话,缓存区里的内容是:asd\n12\nCornflower\n 。那么问题出现了,在第二个程序中我们用的都是scanner.nextLine(); ,他会根据\n的位置完整地读取每一份数据并赋值给对应变量。而现在,我们用的分别是scanner.nextLine(); 、 scanner.nextInt(); 、 scanner.nextLine(); ,他们的结束接收条件分别为 \n 、数值、\n 。
此时三个函数就会将数据读成这样:
很明显第二个scanner.nextInt()在遇到数值12后就已经结束接收,而就在我按下“进行下一个输入”的回车时,直接结束了第三个 scanner.nextLine();的接收。
因此这就是为什么会出现后面的数据还没有来得及输入,程序就已经结束的情况。
解决方法
那有没有解决办法呢?
肯定的好吧
方法很简单,就是在第二个和第三个方法之间加简单的 scanner.nextLine(); 方法 。这样那个被错误地结束第三个方法接收的“\n”,就被其他方法替代了。而第三个scanner.nextLine();也就可以正常接收数据了。
这是加上scanner.nextLine();后的缓存区读取情况:
这是加上scanner.nextLine();后程序以及运行结果:
Scanner scanner = new Scanner(System.in); System.out.printf("请输入你的名字: "); String name = scanner.nextLine(); System.out.printf("请输入你的出生年份 "); int age = scanner.nextInt(); scanner.nextLine(); //加的 System.out.printf("请输入你喜欢的花 : "); String nan = scanner.nextLine(); System.out.printf( "你的名字是: " +name+ "%n 你的出生年份是 :" +age+ "%n 你喜欢的花是 :" +nan );
请输入你的名字: asd
请输入你的出生年份 12
请输入你喜欢的花 : Cornflower
你的名字是: asd
你的出生年份是 :12
你喜欢的花是 :Cornflower
Process finished with exit code 0
这回就很愉快地输入并输出啦!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。