一、先看一段正常的代码
1. 一段用Scanner捕获键盘输入的代码:
Scanner sc = new Scanner(System.in); // 先读取键盘输入的字符串 System.out.println("input name :"); String name = sc.nextLine(); // 后读取键盘输入的int值 System.out.println("input id :"); int id = sc.nextInt(); System.out.println("id = " + id + " name =[" + name + "]"); System.out.println("execute finish !");
2. 测试结果
2.1 运行程序
input name :
lings //键盘输入
input id :
0 //键盘输入
2.2 程序输出
id = 0 name =[lings] execute finish !
和预期一样。
二、一个小变化,颠倒一下取值类型的顺序
1. 一段改变了取值顺序的代码:
Scanner sc = new Scanner(System.in); // 先读取键盘输入的int值 System.out.println("input id :"); int id = sc.nextInt(); // 后读取键盘输入的字符串 System.out.println("input name :"); String name = sc.nextLine(); System.out.println("id = " + id + " name =[" + name + "]"); System.out.println("execute finish !");
2. 测试结果
2.1 运行程序
input id :
0 //键盘输入
input name :
2.2 程序输出
id = 0 name =[] execute finish !
咦?说好的阻塞呢?我还没输入字符串怎么就执行结束了???
3. 原因如下:
nextInt方法根据分隔符(回车,空格等)只取出输入的流中分割的第一部分并解析成Int,然后把后面的字节传递下去。 所以,第二种情况键盘实际输入是“0+回车”,nextInt读出了“0”,并留下了“回车”, 接着netxLine读到了一个“回车”,这是字符串的结束判定符啊,所以读到的字符串就是空字符串“”。
4. 有点晕?继续测试:
4.1 运行程序
input id :
0 lings //键盘输入
input name :
4.2 程序输出
id = 0 name =[ lings] //注意空格 execute finish !
这下清楚了吗?
三、使用注意事项
需要从键盘输入多个参数,尽量把nextLine类型放前面,nextInt放后面,实在不行。
nextInt后面要跟一个nextLine方法“消化”掉那个多余的字符串。
1. 消化掉多余字符串的例子
Scanner sc = new Scanner(System.in); System.out.println("input id :"); int id = sc.nextInt(); sc.nextLine(); System.out.println("input name :"); String name = sc.nextLine(); System.out.println("id = " + id + " name =[" + name + "]"); System.out.println("execute finish !");
2. 测试结果
2.1 运行程序
input id :
0
input name :
lings
2.2 程序输出
id = 0 name =[lings] execute finish !