解决一个无聊的问题,如何处理Java程序,用户在dos窗口输入被收集信息时拷贝带换行符的文本信息造成的while的多次循环(java解决Scanner.next在接收用户输入时出现多个换行的形况)[解决方案一]
问题描述:
用户在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已经解决了
浙公网安备 33010602011771号