Scanner对象及其获取数据出现小问题和解决方案
Scanner类简介:
Java 5添加了java.util.Scanner类,我们可以通过Scanner类来获取用户输入。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。
基本语法:
1 import java.util.Scanner; 2 public class ScannerDemo { 3 public static void main(String[] args) { 4 Scanner scan = new Scanner(System.in); 5 // 从键盘接收数据 6 // nextInt方式接收字符串 7 System.out.println("nextInt方式接收:"); 8 // 判断是否还有输入 9 if (scan.hasNextInt()) { 10 int i = scan.nextInt(); 11 System.out.println("输入的数据为:" + i); 12 } 13 scan.close(); 14 } 15 } 16 // 假如用户输入数据为:10,那么该程序结果为: 17 // 输入的数据为:10
部分API方法:
其实上图的意思就是,比如:nextlnt():只读取int值,就是只能读取整数类型的数据,如果输入了非整型的数据(浮点型字符串等)就会报错。nextFloat()、nextDouble()这些也是以此类推,只能读取符合该类型的数据。
常用三个方法区别(next()、nextLine()、nextInt()):
①nextInt()只读取数值,读取完后\n没有读取并且光标放在本行
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
②next()方法遇到第一个扫描有效字符,即第一个非空格非换行符后面开始,一直获取到下一个空格,换行符之前的,单个字符串
Scanner sc=new Scanner(System.in);
int i=sc.next();
③nextLine()可以扫描到一行内容并作为一个字符串而被获取到
Scanner sc=new Scanner(System.in);
int=sc.nextLine();
使用nextInt()、nextLine()出现的小问题及解决方法:
当Scanner对象同时使用nextInt()和nextLine()方法时,会出现nextLine()没有任何输出内容,如下代码:
1 import java.util.Scanner; 2 public class ScannerText{ 3 public static void main(String[] args){ 4 Scanner sc = new Scanner(System.in); 5 System.out.println("请输入数字"); 6 // 接收输入的数字 7 int number = sc.nextInt(); 8 System.out.println("请输入字符串"); 9 // 接收输入的字符串 10 String str = sc.nextLine(); 11 System.out.println("number:"+number+", str:"+str); 12 } 13 }
结果:
请输入数字 10 请输入字符串 number:10, srt:// 可以发现,当我们刚按照提示输入数字并回车时(我输入的是10并回车),代码直接执行到最后并结束了,这是为什么呢?
因为:
nextInt():是键盘录入整数的方法,当我们录入10 并回车的时候,其实在键盘上录入的是10和\r\n,nextInt()方法只获取到10就结束了
nextLine():是键盘录入字符串的方法,可以接受任意类型,但是他凭什么能获取一行呢?是通过\r\n,只要遇到\r\n就证明一行结束
所以:
在上述代码示例操作中,当我们输入10并回车的时候,nextInt()在我们输入10的时候就结束录入,而剩下的\r\n正好遇到nerxtLine()方法,并且还是该方法的结束证明,所以,我们还没按照提示输入字符串程序就已经结束;
解决方案一:
在输入第二次字符串的时候,在new一个Scanner对象(但是这种比较消耗内存资源,不推荐)
1 import java.util.Scanner; 2 public class ScannerText{ 3 public static void main(String[] args){ 4 Scanner sc1 = new Scanner(System.in); 5 System.out.println("请输入数字"); 6 // 接收输入的数字 7 int number = sc1.nextInt(); 8 System.out.println("请输入字符串"); 9 // 在输入第二次字符串的时候,再new一个scanner对象 10 Scanner sc2 = new Scanner(System.in); 11 // 接收输入的字符串 12 String str = sc2.nextLine(); 13 System.out.println("number:"+number+", str:"+str); 14 } 15 }
解决方案二:
不管是数字还是字符串,都统一用nextLine()方法接收,接收之后在将结果进行处理,如果需要是int数据,将其结果转成int就ok
1 import java.util.Scanner; 2 public class ScannerText{ 3 public static void main(String[] args){ 4 Scanner scanner = new Scanner(System.in); 5 System.out.println("请输入数字"); 6 // 用String类型接收输入的数字 7 String str1 = scanner.nextLine(); 8 // 将String类型转换成int/Integer类型 9 int i = Integer.valueOf(str1); 10 // 查看数据类型 11 System.out.println("数据类型是:"+Integer.valueOf(str1).TYPE); 12 } 13 }
结果:
1 请输入数字 2 10 3 数据类型是:int
转载于:https://www.cnblogs.com/wgc-blog/p/10720985.html
Scanner对象及其获取数据出现小问题和解决方案相关推荐
- 通过Scanner从控制台获取数据
----------siwuxie095 Scanner类用于扫描从控制台输入的数据,可以接收字符串和基本数据类型的数据 Scanner类位于 java.util.Scanner 包中 Scanner ...
- scanner 获取控制台信息_通过Scanner从控制台获取数据
Java入门系列-07-从控制台中接收输入 这篇文章帮你使用Scanner类从控制台接收输入 从控制台接收字符串 敲一敲: import java.util.Scanner; public class ...
- document在方法外获取对象无法获取数据
案例目的:当我点击添加按钮的时候,表格下方可以添加一行数据 遇到一个问题希望有大佬帮我看看,以下两个代码区别在于使用document获取对象的时候,第一个是在方法外获取对象,第二个是在方法内获取对象 ...
- 【小程序】【Tips】【前端】交互【后端】从Json对象数组里面获取数据的方法 - PHP - JS 的原生方法
小程序后端和前端之间是通过,json的格式来传数据的,那么,数据如何获取呢?这就分两个部分 1 就是后端到前端 后端我们考虑是PHP环境,前端是JS, 那么在JS里面,很简单: 比如,小程序一般在前端 ...
- Scanner对象接收数据进行分类处理 java
Scanner对象接收数据进行分类处理 java 键盘数据类型判断 不同的类型走不同的分支 import java.util.Scanner;public class Test {public sta ...
- 微信小程序获取数据接口动态渲染Echarts折线图
上篇文章介绍的是最简单的折线图配置方法,若是放到开发的项目中还需要进行一些改动,比如,如何调用接口获取数据动态渲染折线图: 为了更好的体验项目开发中调取接口获得数据渲染折线图,我让朋友给我开发了接口模 ...
- Request对象获取数据
1. Request对象 Request(.NET中的内置对象)---从客户端接收消息 获取前端的数据;比如form表单中的内容 ,cookis,表头信息,浏览器种类 2. 集合(对数据的封装) 对象 ...
- R语言head函数和tail函数获取dataframe、列表list、向量vector的头部和尾部数据:tail提取数据对象的尾部数据、head提取数据对象的头部数据、默认6条数据、自定义设置返回条数
R语言head函数和tail函数获取dataframe.列表list.向量vector的头部和尾部数据:tail提取数据对象的尾部数据.head提取数据对象的头部数据.默认6条数据.自定义设置返回条数 ...
- R语言get函数、get0函数、mget函数获取数据对象实战
R语言get函数.get0函数.mget函数获取数据对象实战 目录 R语言get函数.get0函数.mget函数获取数据对象实战 #基本语法
最新文章
- 【网络安全】一些webshell免杀的技巧
- 使用React hooks,些许又多了不少摸鱼时间
- sort函数用法python_python内置函数sorted()及sort() 函数用法和区别
- pdf python 3.7编程快速入门 潘中强_无python基础,这些书籍可以帮您快速入门。
- 解决adb devices无法连接夜神模拟器
- anylogic 学习(1)—— anylogic 简单介绍
- linux安装使用7zip
- Android开发艺术探索知识回顾——第0章 书本内容介绍
- 5G无线技术基础自学系列 | 5G信道结构
- 实数系的基本定理_为什么极限理论的建立需要实数理论?
- 湖北省仙桃市谷歌高清卫星地图下载
- DC-DC升压芯片MP9185
- js事件驱动模型图解
- 2018年浙江省网络安全技能竞赛ctf部分解题思路writeup
- 如果黑客转行干活动策划,我再也不怕开会睡着了
- 计算机系统1 实验 LC-3 Nim游戏 子程序
- vue 组件内引入外部在线js、css
- 《从懵懂学生懵懂社会一份子》-2015.07.09
- R语言使用MatchIt包进行倾向性匹配分析、使用match.data函数构建匹配后的样本集合、通过分析不同分组对应的协变量的均值来判断倾向性评分匹配后样本中的所有协变量的平衡情况
- 游戏制作之路(56)模拟水
热门文章
- 关于LUA+Unity开发_toLua篇【二】
- 如何减少浏览器repaint和reflow(下)
- 《Android 开发入门与实战(第二版)》——6.6节配置改变
- 针对 AlloyFinger 中 currentTarget为空的解决方案
- 怎么修改Outlook2010 PST数据文件位置(默认邮件存储目录)
- 医院电脑瘫痪 病人排长队苦等5小时
- 如何写一个通用的README规范
- nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
- 关键基础设施是否会成为DDoS攻击的新目标?答案是不大会
- scala dynamics 示例