博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
控制台下Java中Scanner类的next方法与nextLine方法联用的一个小问题
阅读量:4091 次
发布时间:2019-05-25

本文共 2360 字,大约阅读时间需要 7 分钟。

目录

 


一、引入问题

最近突然发现Scanner类的next()、nextInt()、nextDouble()等方法与nextLine()方法联用时,会出现无法通过nextLine()获得数据的现象。下面给一个例子。

import java.util.Scanner;public class ScannerTest {	public static void main(String[] args) {		Scanner sc = new Scanner(System.in);				System.out.println("Please enter an int number: ");		int intNum = sc.nextInt();		System.out.println("Please enter an line of strings: ");		String str = sc.nextLine();				sc.close();		System.out.println("intNum:"+intNum);		System.out.println("str:   "+str);	}}

运行结果为如下所示,nextLine()方法被“跳过”了。事实上,把nextInt()换成next()、nextDouble()等方法结果也是这样。

二、分析问题

我们试着改变两者的输入顺序

import java.util.Scanner;public class ScannerTest {	public static void main(String[] args) {		Scanner sc = new Scanner(System.in);				System.out.println("Please enter an line of strings: ");		String str = sc.nextLine();		System.out.println("Please enter an int number: ");		int intNum = sc.nextInt();				sc.close();		System.out.println("intNum:"+intNum);		System.out.println("str:   "+str);	}}

发现这回的结果却是正常的。

查看一下用户文档上两个方法用法上的区别:

nextInt()Scans the next token of the input as an int.nextLine()Advances this scanner past the current line and returns the input that was skipped.

next()、nextInt()、nextDouble()等方法会以空白(空格、\n)为分隔符,截取两个空白之间的字符串作为token,并将其返回。而nextLine()方法则是扫描光标到当前行行尾的所有字符,并将它们作为一个整体返回。也就是说,nextLine()方法会从当前光标处的字符一直扫描,直到出现换行符\n(即,行尾)。

这么一来,上面的问题原因就出来了:由于我们输入第一个整数时,敲了一下回车键(\n),所以导致nextLine()方法因为提前遇到换行符\n而结束。

三、验证猜想

还是上面第一个程序,我们在运行一下。

发现这时,nextLine()方法就将光标处的第一个空格以及后面的Jones Snow都扫描到了。所以说,上面的猜想是正确的。

四、解决方案

这里有两个小方案来解决上面的问题。

(1)多加一个nextLine()方法,将输入整数时多出的一个回车键(\n)消费掉

public static void main(String[] args) {		Scanner sc = new Scanner(System.in);				System.out.println("Please enter an int number: ");		int intNum = sc.nextInt();		System.out.println("Please enter an line of strings: ");		sc.nextLine();		String str = sc.nextLine();				sc.close();		System.out.println("intNum:"+intNum);		System.out.println("str:   "+str);		}

(2)用两个扫描器,一个输入整数,一个输入一行字符串,这样就互不影响了

public static void main(String[] args) {		Scanner sc = new Scanner(System.in);		Scanner sc2 = new Scanner(System.in);				System.out.println("Please enter an int number: ");		int intNum = sc.nextInt();		System.out.println("Please enter an line of strings: ");		String str = sc2.nextLine();				sc.close();		sc2.close();		System.out.println("intNum:"+intNum);		System.out.println("str:   "+str);	}

 

转载地址:http://hbnii.baihongyu.com/

你可能感兴趣的文章
Java 8新特性:Stream API
查看>>
管理用户状态——Cookie与Session
查看>>
最受欢迎的前端框架Bootstrap 入门
查看>>
JavaScript编程简介:DOM、AJAX与Chrome调试器
查看>>
通过Maven管理项目依赖
查看>>
通过Spring Boot三分钟创建Spring Web项目
查看>>
Spring的IoC(依赖注入)原理
查看>>
Guava快速入门
查看>>
Java编程基础:static的用法
查看>>
Java编程基础:抽象类和接口
查看>>
Java编程基础:异常处理
查看>>
Java编程基础:了解面向对象
查看>>
新一代Java模板引擎Thymeleaf
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
Spring Boot构建简单的微博应用
查看>>
Spring处理表单提交
查看>>
Spring MVC异常处理
查看>>
Leetcode 1180. Count Substrings with Only One Distinct Letter [Python]
查看>>
PHP 7 的五大新特性
查看>>
php使用 memcache 来存储 session
查看>>