A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 吴洪标 于 2018-12-1 21:37 编辑

今天在写一段代码时,用到了Scanner类,在调用nextLine()方法的时候发现,如果前面有nextDouble(),则nextLine()会接收nextDouble()去掉的回车键作为它的结束符,这在循环语句中导致程序被多运行一次。

在下面的代码中,如果在nextLine()中多次输入回车键,那么这些回车键会被缓存起来,等到输入字符串时,nextLine()先接收前面的回车键,再接收字符串,此时打印语句会被连续执行多次。

具体情况看代码及注释。


import
java.util.Scanner;
public class OperatorDemo {
    public static void main(String[] args) {
        ticketForFree();
    }
    public static void ticketForFree() {
        System.out.println("小朋友你多高?");
        Scanner scan = new Scanner(System.in);
        while (true) {
               // 若不输入正确的身高值,就一直问他,直到他输入正确的身高值为止if (scan.hasNextDouble()) {
                double h = scan.nextDouble();  // 若在输入双精度浮点型数字之前,先输入了几个回车键,则这几个回车键会被nextDouble()给忽视掉,因此只剩下数字和后面的一个回车键。                                String s = scan.nextLine();  // 这行代码可以用来吃掉nextDouble()去掉的回车键
                if (h > 0.5 && h < 2.2) { // 判断是否有双精度的数值输入
                    // 判断身高是否在人类正常范围内double height = h;
                    if (height < 1.4) {
                        System.out.println("免费坐车!");
                    }else {
                        System.out.println("要买票哦!");
                    }
                    break;
                } else {
                    double height = h;
                    System.out.println(height + "米不是正常人类的身高值,请输入正确的身高值,例如1.5");
                }
            } else {
                String str = scan.nextLine();  // 这一句,当输入一个边界之外的数值之后,再次输入一个字符串,那么后面的打印输出语句会被执行两次,为什么?
                // 因为nextLine()自动读取了被double h = scan.nextDouble()去掉的Enter作为他的结束符,所以没办法给str从键盘输入值。此时程序向下执行输出语句。若在double h = scan.nextDouble()后面再加一句String s = scan.nextLine(),去吃掉那个回车键,则可以正常运行程序。
                                            
                // 然而,即便如此,若输入时先敲了几个回车键,再输入字符串,则问题同样会产生。这是因为,当直接输入回车键时,因为没有任何输入,所以if-else这两个语句块都不会进入,这时回车键都在缓存里存着。这时候再输入字符串,那么 这几个回车键就都被else语句块中的nextLine()捕捉到,这时候多次触发了后面的打印语句。
                // 所以最好的解决方案是在这里使用next()而不是nextLine()。
System.out.println(str + "不是一个数字,请输入正确的身高值,例如1.6");
            }
        }
    }
}






idea64_2018-12-01_21-27-26.png (7.42 KB, 下载次数: 16)

输入2次回车键,再输入字符串的结果

输入2次回车键,再输入字符串的结果

1 个回复

倒序浏览
一个人一座城0.0 来自手机 中级黑马 2018-12-2 20:55:42
沙发
到此一观
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马