问题描述:

  用户在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

解决一个无聊的问题,如何处理Java用户在dos被收集信息时拷贝带换行符的文本信息造成的while的多次循环(java解决Scanner.next在接收用户输入时出现多个换行的形况)[解决方案一]的更多相关文章

  1. 将html中的br换行符转换为文本输入中的换行符(转)

    PHP中的有个非常好的函数:nl2br(),将文本框中的换行转换为HTML页面的<br />,但是如何实现将html中的<br />换行符转换为文本框中的换行符呢?下面这几个方 ...

  2. php函数nl2br的反函数br2nl 将html中的br换行符转换为文本输入中的换行符

    下面这几个方法将能够帮你解决这个问题. PHP版将html中的<br />换行符转换为文本框中的换行符: 代码如下: function br2nl($text){ return preg_ ...

  3. 换行符在ajax中返回json,eval时发生的 Unexpected token ILLEGAL

    用户如果输入了换行在数据中记录为‘空格’,但不是真正的空格. 程序前台采用ajax和json返回数据绑定时会 出现 Unexpected token ILLEGAL 例子: 在sql中存储为下图 在“ ...

  4. 【转载】Java中的回车换行符/n /r /t

    source:http://hane00.blog.163.com/blog/static/1600615220126204446809/ '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标 ...

  5. 第4章 Java接收用户输入

    第4章 Java接收用户输入 1.输入 使用Scanner工具类可以换取用户输入的数据Scanner类位于java.util包中,使用时需要导入此包使用步骤: 1.导入java.util.Scanne ...

  6. 键盘接收用户输入案例2(案例内容包含键盘接收 int、String、Char、double、boolean)等类型及介绍

    int类型: int age = input.nextInt();    double类型: double score = input.nextDouble(); String类型: String n ...

  7. C#入门教程(三)–接收用户输入、转义字符、类型转换-打造C#入门教程

    上次教程主要讲解了visual stdio快捷键.变量相关的知识.具体教程戳这里:http://www.chengxiaoxiao.com/net/1027.html 越来越深入去写教程越来越发现,自 ...

  8. 03-java学习-基本数据类型-运算符-键盘接收用户输入

    java的八大基本数据类型: 类型转换的基本原则: java整数的默认类型是int,小数的默认类型是double 运算符: 算术运算符.连接.赋值.关系.逻辑.三目运算符等…… 键盘接收用户输入: j ...

  9. Xamarin iOS教程之使用按钮接接收用户输入

    Xamarin iOS教程之使用按钮接接收用户输入 Xamarin iOS使用按钮接接收用户输入 按钮是用户交互的最基础控件.即使是在iPhone或者iPad中,用户使用最多操作也是通过触摸实现点击. ...

随机推荐

  1. IP多播与NAT地址转化

    IP多播 与单播相比,在一对多的通信中,多播可以大大减少网络资源.在互联网上进行多播就叫做IP多播,IP多播所传送的分组需要使用IP多播地址. 如果某台主机想要收到某个特定的多播分组,那么怎样才能是这 ...

  2. 5.java内存模型详细解析

    一. java结构体系 Description of Java Conceptual Diagram(java结构) 我们经常说到JVM调优,JVM和JDK到底什么关系,大家知道么?这是java基础. ...

  3. (Java)面向对象的三大特征

    封装.继承与多态 封装 封装的作用(好处) 提高程序安全性,保护数据 隐藏代码的实现细节 统一接口 增加系统可维护性 属性私有(关键字private) 加上Private可使该属性私有于一个类,在其他 ...

  4. modal框

    modal框 创建modal款的基本"框架": 1 <body> 2 <!--1.触发模态框的按钮--> 3 <button class=" ...

  5. Flask的环境配置

      Flask django是大而全,提供所有常用的功能 flask是小而精,只提供核心功能 环境配置 为了防止 django和 flask环境相互冲突,可以使用 虚拟环境分割开 pip instal ...

  6. python和js分别在多行字符串中插入一行字符串

    问题 一个多行字符串,"asfdb;\nwesfpjoing;\nwbfliqwbefpwqufn\nasfdwe\nsafewt\nqwern\nvar\ntgwtg\n\nftwg\n& ...

  7. 微信小程序中路由跳转

    一.是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小程序中,每个页面可以看成是一个pageMo ...

  8. 初始HTML03

    **------------恢复内容开始------------** HTML 页面标签组成 一个完整的页面仅有一个html元素,在这个元素之下,包含head和body元素,前者负责说明页面结构,后者 ...

  9. 使用Google Fonts注意事项

    Google Fonts是一个字体嵌入服务库. 这包括免费和开源字体系列.用于浏览库的交互式 Web 目录以及用于通过 CSS 和 Android 使用字体的 API. Google 字体库中的流行字 ...

  10. Noip模拟57 2021.9.20

    规律总结:联考必爆炸 T1 2A 没$A$掉的大水题,但是是真的不知道$000$前面的$00$也算先导$0$,以后要长记性,这种东西不能再错了 再打三遍: $000$前面的$00$也算先导$0$ $0 ...