在之前学习java 的时候,有用到过这样一个类Scanner用于在控制台输入内信息,但是在输入的时候偶然出现过一个问题:
举个栗子:
Scanner input = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = input.nextLine();
System.out.println("请输入学号:");
int snum = input.nextInt();
System.out.println("你的姓名和学号为:"+name+"-"+snum);
功能可以体现出来
当将学号和姓名的输入顺序调整一下! 神奇的事情就发生了!
Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int snum = input.nextInt();
System.out.println("请输入姓名:");
String name = input.nextLine();
System.out.println("你的姓名和学号为:"+name+"-"+snum);
结果:
我们会发现,在输入学号之后,直接就跳过了输入姓名的过程,这就尴尬了,为什么会这样呢?
后面才发现,原来是Scanner 类对象中的 nextInt() 和 nextLine() 方法内部读取原理不同导致的。
对于nextLine()方法,在该例子中,当input调用nextLine()方法时,读取的是字符串形式,输入的内容就相当于在一个管道中。
在未输入的时候,类似于阻塞状态,当输入内容之后,输入回车,然后nextLine()方法就开始读取内容,nextLine的读取方式是将enter回车符号(\r\n)和输入内容一同读取出来,在赋值的时候它再将enter回车符除去。大概的可以理解为如下图:
输入:
读完之后,管道里面是空的。
对于nextInt()方法,在该例子中,当input调用nextInt()方法时,读取的是int整型形式,输入的内容就相当于在一个管道中。
在未输入的时候,类似于阻塞状态,当输入内容之后,输入回车,然后nextInt()方法就开始读取内容,nextInt的读取方式是将enter回车符号(\r\n)之前的输入内容读取出来,Enter回车符留在里里面。类似的还有nextLong();nextDouble;等等。大概的可以理解为如下图:
输入:
读完之后,管道里面还存在Enter回车符。
看到这,便可以解释这个神奇的事情了。
当先输入学号时调用的是nextInt()方法,读取完后剩下一个Enter回车符,不巧的是接下来输入姓名的时候,调用的是nextLine()方法,这时刚好有一个Enter回车符,它便以为输入完了就直接将Enter前面的空串读取进去了,所以我们看着的效果就像是直接跳过了输入姓名过程。
解决这个问题的方法有3种:
1,在调用nextInt()方法之后,nextLine()方法之前,加上一个语句 input.nextLine(); 将nextInt()读取后剩下的Enter回车符先读取掉。
Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int snum = input.nextInt();
input.nextLine();//将回车符读取出来
System.out.println("请输入姓名:");
String name = input.nextLine();
System.out.println("你的姓名和学号为:"+name+"-"+snum);
2,使用 next() 方法之前代替 nexLine() 方法。
Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int snum = input.nextInt();
System.out.println("请输入姓名:");
String name = input.next();//使用next()方法之前代替nexLine()方法
System.out.println("你的姓名和学号为:"+name+"-"+snum);
3,都使用nextLine()方法,赋值的时候再进行类型转换。
Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int snum = Integer.parseInt(input.nextLine());
System.out.println("请输入姓名:");
String name = input.nextLine();
System.out.println("你的姓名和学号为:"+name+"-"+snum);