黑马程序员技术交流社区
标题:
scanner nextint后不能nextline详解
[打印本页]
作者:
坚持努力wbj
时间:
2016-10-11 01:28
标题:
scanner nextint后不能nextline详解
表现:
目的:scanner输入时,使用死循环判断输入类型是否匹配,如果不匹配提示再次输入,然后进入下一次循环等待输入
状况:输入一次以后,如果不匹配,则一直输出提示输入人错误重新输入的语句,不给输输入机会
提示:无提示
代码:
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\db4e4baa71674cd388f5f1fd0dea9654\clipboard.png[/img]
原因:
自己分析:
查看api:
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\5407c0c9bb024bd6a44b59329bff61f6\clipboard.png[/img]
>>>>scanner是一个文本扫描器:可以理解为一个容器,用了装读取到的信息,扫描了以后可以转换为不同类型
默认是空的
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\6a368675674d417583f429f44050d7d1\clipboard.png[/img]
>>>>扫描器使用的是默认空白分隔符,所以每次扫描前要将扫描器分隔符置为默认空白分隔符
查看nextInt()源码:
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\f363b114ca0b4aedb3c7b7da7bf03902\clipboard.png[/img]
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\e3bb28017881470f8e2873648eb903fc\clipboard.png[/img]
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\84d9b1730a14434c946470b7e27f33cf\clipboard.png[/img]
在看next()的源码
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\c06d26dc3a3b48a3b47b29aabcea33f9\clipboard.png[/img]
两个方法都调用了一个方法clearCaches();
查看该方法,发现它为Scanner类的的一个方法
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\8d3bfd997028491fb88499455b5efb5a\clipboard.png[/img]
这里将一些东西置空了,查看是什么东西:
hasNextPattern和typacache均为Scanner类的成员变量
hasNextPattern:
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\eb8e19ef16db42fbae7fbf252f2f18fa\clipboard.png[/img]
API中Pattern类的介绍:
类 Pattern
java.lang.Object
java.util.regex.Pattern
所有已实现的接口:
Serializable
public final class Pattern
extends
Object
implements
Serializable
正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。
然后,可将得到的模式用于创建
Matcher
对象,依照正则表达式,该对象可以与任意
字符序列
匹配。
执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.
compile
("a*b"); Matcher m = p.
matcher
("aaaaab"); boolean b = m.
matches
();
在仅使用一次正则表达式时,可以方便地通过此类定义
matches
方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b", "aaaaab");
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。
Matcher
类的实例用于此目的则不安全。
>>>>>与缓存字符串有关
再看ypacache:
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\26e00ba2e94b4ab59d767745644e4f38\clipboard.png[/img]
由上面可知每一次调用nextXxx()方法都会讲Scanner 对象置空,而现在的循环不能将它置空,也就不能扫描,不能输入了:
这就需要重置Scanner扫描器,Scanner方法提供了一个seset()方法
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\09d9b9b6edc846ef86bbaf82c41844ac\clipboard.png[/img]
但发现>>调用后仍然不可以解决这个问题
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\07eb1d288a4149c88dadaaa7283a716d\clipboard.png[/img]
改用间接方法将它清除:
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\da2522981ffa46308479f9d4eefd4a18\clipboard.png[/img]
可以直接让Scanner对象中的数据释放,不去接受也就不创建对象
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\1ea05c8d7a3249c3b56713dd0f213a7b\clipboard.png[/img]
拓展:Scanner的next()方法不接受换行符号,如果next()后没有释放\r\n的语句就跟着nextline(),nextline()也不能输入
[img]I:\YouDaoYunBiJi\
wangbaojun1992@163.com
(1)\38943d37b678466aa2bce2f5b522367c\clipboard.png[/img]
作者:
堂吉诃德
时间:
2016-10-11 07:56
重新new个Scanner做接受吧
作者:
songchangchang
时间:
2016-10-11 09:22
先接受nextLine,再nextInt,或者创建两个Scanner分别接受,好像是这样解决
作者:
tianyass
时间:
2016-10-11 13:42
学习了!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2