Scanner扫描nextInt(),next()与nextLine()连用问题

一、 方法简述

Scanner类用于接收用户输入的内容。是jdk1.5之后的为了简化文本扫描的新增类,支持读取多种数据类型。

使用Scanner扫描,创建扫描器后,控制台输入数据,此时数据全部存入缓冲区;
再使用next()等方法从一块缓冲区读取相应内容。一般从遇到的第一个有效字符()开始读取,当遇到分隔符/结束符停止读取。

使用nextInt(),next(),nextLine()读取方式的具体差异:

方法返回值开始读取字符(包括此字符)停止读取字符(不包括此字符)光标位置
next()StringString空格/回车/制表符仍在本行
nextXxx()基本数据类型xxxxxx空格/回车/制表符仍在本行
nextLine()String任意字符回车移动到下一行起始位置

都以回车结束本方法,执行下个方法。next()和nextXxx()不会读取 空格/回车/制表符

用next()和nextXxx()读取时,光标停留在结束符所在的一行。
此时缓冲区仍遗留有分割符/结束符及它们以后的内容,光标停留在这个分隔符/结束符,再使用其他读取方法都从这个分隔符/结束符开始扫描,按照自己规则读取。

如果下个方法使用nextLine(),最少会读取到一个“回车”的内容,同时“回车”又作为停止的标志,结束这一个nextLine()。
所以,next()或nextXxx()之后一般使用两个nextLine()来实现继续扫描读取一行内容。

二、 nextInt() / nextXxx() / next() 后跟 nextLine() 问题

1、如果nextXxx()或next()后面不采取措施直接使用nextLine()读取新的输入数据:

		Scanner input=new Scanner(System.in);

		System.out.println("请输入一行话将(使用next()读取)");
		String s0=input.next();
		System.out.println(s0);
		
		//nextLine()读取到了 回车 ,回车是nextLine()的有效内容,也是其结束内容
		System.out.println("请输入一行话(将使用nextLine()读取)");
		String s1=input.nextLine();
		System.out.println(s1);
		
		System.out.println("请输入一行话将(使用next()读取)");
		String s3=input.next();
		System.out.println(s3);

启动程序,输入:“a1”,回车

控制台:
在这里插入图片描述
悲剧就产生了,好像nextLine()失效了一样。

2、为了使用nextLine(),让我们在next()后先加一行nextLine():

		Scanner input=new Scanner(System.in);

		System.out.println("请输入一行话将(使用next()读取)");
		String s0=input.next();
		System.out.println(s0);
		
		//此处添加nextLine()处理掉刚才输入的内容
		input.nextLine();
		System.out.println("已处理掉刚才的缓冲区内容");
		
		System.out.println("请输入一行话(将使用nextLine()读取)");
		String s1=input.nextLine();
		System.out.println(s1);
		
		System.out.println("请输入一行话将(使用next()读取)");
		String s3=input.next();
		System.out.println(s3);

启动程序同样操作。

控制台:
在这里插入图片描述
使用一行nextLine()就让程序看起来天衣无缝了~

三、 scanner读取方式综合演示

再来一个综合版scanner读取,使大家更清楚的看到这种奇妙的读取方式:

		Scanner input=new Scanner(System.in);
		
		System.out.println("请输入一个整数(将使用nextInt()读取)");
		int a0=input.nextInt();
		System.out.println(a0);
		
		System.out.println("请输入一个双精度数字(将使用nextDouble()读取)");
		double a1=input.nextDouble();
		System.out.println(a1);
		
		//空格,回车,制表符都被nextLIne()当作有效内容
		System.out.println("请输入一行话(将使用nextLine()读取)");
		String a2=input.nextLine();
		System.out.println(a2);
		
		System.out.println("请输入一行话将(使用next()读取)");
		String a3=input.next();
		System.out.println(a3);
		
		System.out.println("请输入一个整数(将使用nextInt()读取)");
		int a4=input.nextInt();
		System.out.println(a4);

启动程序依次输入: “12”,制表符,“3”,空格,“4+”,空格,回车结束
(输入加号仅仅为了区分字符串)

控制台
在这里插入图片描述
继续输入:空格,“5+6”,制表符,“5”,回车结束

控制台
在这里插入图片描述
可以看到,我们总共只输入了两次,但进行了5次读取。

验证了所有next读取方法读完有效字符后,执行下一个方法。都从能读取的有效字符开始:next()和nextXxx()都是读到空格/回车/制表符即结束,nextLine()则读到回车才结束。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值