问题描述:

  用户在dos窗口输入的时候(web项目不会出现这样的问题,所以这个问题日常碰不到),摁下回车时,Scanner对象的next()扫描用户输入的文本,后面就可以根据输入的字符串进行判断,并执行以后的处理,但是,如果用户选择从别的地方粘,并且是多行的那种

比如:

此时的字符后面回跟上回车符,整体的逻辑又在循环里面进行判断,就会导致自己没动,代码已经跑了换行数量的遍数,这里我写一个简易的demo,演示一下

 1 public static void main(String[] args) {
2 Scanner sc = new Scanner(System.in);
3 String choose;
4 while (true){
5 long l1 = System.currentTimeMillis();
6 System.out.println("请输入您的年龄");
7 choose = sc.next();
8
9 System.out.println("成功录入执行的代码"+choose);
10 }
11 }
// 为什么要用while循环套着?因为要做类型转换异常后的continue

输入和输出的结果

请输入您的年龄
asdsa
sadas
sadasasdasd
asdas
成功录入执行的代码asdsa
请输入您的年龄
成功录入执行的代码sadas
请输入您的年龄
成功录入执行的代码sadasasdasd
请输入您的年龄
成功录入执行的代码asdas
请输入您的年龄

此时这就不是我们想要的一个效果,或者进行一个逻辑的修改,一下子录入全部的信息,也不是问题,这里先说第一种解决方法,就是只录最后一次输入的,让它自动录入到最后一行(录入第一行的我也试过了,无法实现,有大神能给出解决方案吗)

// 这是我想要录入第一行的代码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String choose;
String temp;
while (true) {
long l1 = System.currentTimeMillis();
System.out.println("请输入您的年龄");
choose = sc.next();
while (true) {
temp = sc.next();
long l = System.currentTimeMillis();
if(l - l1 > 3){
System.out.println("正常");
break;
} else {
continue;
}
}
System.out.println("成功录入执行的代码" + choose);
}
}
// 代码到解决思路中讲解

输入和输出的结果

请输入您的年龄
asdsa
sadas
sadasasdasd
asdas
正常
成功录入执行的代码asdsa
请输入您的年龄
1
正常
成功录入执行的代码sadasasdasd
请输入您的年龄
1
1
正常
成功录入执行的代码1
请输入您的年龄
// 此时多次输入可以成功,但用户单次输入就要输入两次,用户体验不佳

解决思路:

  因为用户输入得文本包含回车符,所以相当于输入后按了个回车,导致它自己会不停的自动录入,所以我们要先确定用户输入的一定得是一行,如果包含多行,要想办法把它给消失掉,要把这个逻辑搞明白,(如有新手有不太理解得可以在评论区与我讨论)

 下面开始想办法消除多余的数据,一开始我是想用while循环不停录入,直到录入为空,显然这个逻辑不行,我又开始想第二种方法,这时我想到可以用时间来判断,调用Java的

System.currentTimeMillis(); // 此方法可以获取当前时间的毫秒数,又在我多次测试后发现,中间间隔最大不会超过3,老电脑不一定了

可以在录入前记录一次时间,录入完场后再记录一次时间,时间大于3毫秒的,我们认为它是正常录入,正常执行代码并接收,如果不是就continue回去再次扫描,因为我们可以认为用户是违法输入,人手一般输入干不进3毫秒,有了想法思路后就可以进行代码的编写了

 1 public static void main(String[] args) {
2 Scanner sc = new Scanner(System.in);
3 // 用来接收用户输入的文本
4 String choose;
5 int age;
6 // 循环录入,如果转换出错的话
7 while (true) {
8 // 输出提示信息
9 System.out.println("请输入您的年龄");
10 // 记录录入前的时间
11 long l1 = System.currentTimeMillis();
12 // 开始循环判断是否为不正常输入输入
13 while (true) {
14 // 录入用户输入的信息
15 choose = sc.next();
16 // 记录录入结束的时间
17 long l = System.currentTimeMillis();
18 // 开始进行逻辑判断,是否是正常输入
19 // 正常输入的话时间一定是大于3毫秒的
20 if (l - l1 > 3) {
21 // 正常录入进入正常的代码段
22 System.out.println("正常的录入方式");
23 // 退出当前录入的循环
24 break;
25 } else {
26 continue;
27 }
28 }
29 // 退出录入循环 进入类型转换
30 try {
31 // 如果转换正常开始输出信息
32 age = Integer.valueOf(choose);
33 } catch (NumberFormatException e) {
34 // 转换出现异常,continue回去让用户重新输入
35 System.out.println("输入有误,请输入数字!");
36 continue;
37 }
38 // 输出正常的信息
39 System.out.println("成功录入执行的代码" + choose);
40 // 结束程序
41 return;
42 // 当然这是个小demo的演示,年龄判断的逻辑没有写
43 }
44 }

输入和输出的结果

请输入您的年龄
asdsa
sadas
sadasasdasd
asdas
正常的录入方式
输入有误,请输入数字!
请输入您的年龄
15
正常的录入方式
成功录入执行的代码15 Process finished with exit code 0

此时这个不算BUG的BUG已经解决了

System.currentTimeMillis

最新文章

  1. F-并查集
  2. mac下webpagetest搭建
  3. WPF ArrangeOverride与MeasureOverride
  4. 桂电在线-转变成bootstrap版
  5. [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】
  6. 2.2.1 创建一个 Path
  7. 2016 ACM/ICPC Asia Regional Shenyang Online
  8. Redis 命令参考
  9. IOS(swift)-数据存储 · 用NSUserDefaults存储配置信息
  10. IEnumerable,IQueryable的区别
  11. EPROCESS KPROCESS PEB
  12. 练习使用markdown
  13. 深入理解ES6之—对象
  14. Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
  15. php输出语句有什么不同
  16. git教程笔记(二)
  17. 并发编程基础之volatile关键字的用法
  18. PythonStudy——字符串重要方法 String important method
  19. FineReport中如何安装移动端H5插件
  20. Kali Linux 2017.3发布了

热门文章

  1. RuntimeError: DataLoader worker (pid 18255) is killed by signal: Killed.
  2. Jmeter使用问题记录
  3. GoLang设计模式11 - 备忘录模式
  4. JavaScript05
  5. ShardingJdbc基于Zookeeper实现分布式治理
  6. BPMN 學習實例
  7. 2021.6.29考试总结[NOIP模拟10]
  8. python文件读写及修改
  9. 转:bash shell 语法1
  10. AXI总线简介、ID分析、DMA、Vivado烧录、系统集成