解决一个无聊的问题,如何处理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已经解决了

posted @ 2021-11-18 12:07  沉默的王さん  阅读(101)  评论(0)    收藏  举报