关于Scanner中nextInt()、nextLine()等方法总结与问题解决

发布时间:

Scanner.next?() 有很多种方法,具体名称与内容可以见下表格:

关于Scanner中nextInt()、nextLine()等方法总结与问题解决

关于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 );

结果输出:122321name: 12age: 23nan: 21Process finished with exit code 0

关于Scanner中nextInt()、nextLine()等方法总结与问题解决

此时缓存区里内容是: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()、nextLine()等方法总结与问题解决

很明显第二个scanner.nextInt()在遇到数值12后就已经结束接收,而就在我按下“进行下一个输入”的回车时,直接结束了第三个 scanner.nextLine();的接收。

因此这就是为什么会出现后面的数据还没有来得及输入,程序就已经结束的情况。

解决方法

那有没有解决办法呢?

肯定的好吧

方法很简单,就是在第二个和第三个方法之间加简单的 scanner.nextLine(); 方法 。这样那个被错误地结束第三个方法接收的“\n”,就被其他方法替代了。而第三个scanner.nextLine();也就可以正常接收数据了。

这是加上scanner.nextLine();后的缓存区读取情况:

关于Scanner中nextInt()、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你喜欢的花是 :CornflowerProcess finished with exit code 0

这回就很愉快地输入并输出啦!