一、先看一段正常的代码
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 :0input name :lings2.2 程序输出
id = 0 name =[lings]execute finish !