Scanner中nextInt()方法与nextLine()使用注意事项以及解决办法
1、注意事项:
- nextInt()方法以空格或者回车结束的
- nextLine()方法是以回车结束的
2、错误原因
- 当两个方法同时使用时便会发一些逻辑上的错误
错误示例:
以快柜管理系统为例(注意看注释部分)
public void use(Cabinet cabinet) {
Scanner input = new Scanner(System.in);
int choose;
use:while(true) {
System.out.println("请输入您要进行的操作(1、录入快递 2、删除快递 3、修改快递 4、查看所有快递): ");
if(input.hasNextInt()) {
choose = input.nextInt(); //此处是nextInt()方法
if(choose>5 || choose<1) {
System.out.println("输入有误,请重新输入");
continue;
}
}else {
System.out.println("输入有误,请重新输入");
continue;
}
String id = "";
switch (choose) {
case 1:
cabinet.addExpress();
break;
case 2:
System.out.println("请输入您要删除的快递的单号:");
id = input.nextLine(); //此处是nextLine()方法
cabinet.deleteExpress(id);
break;
case 3:
System.out.println("请输入您要修改的快递的单号:");
id = input.nextLine(); //此处是nextLine()方法
cabinet.modifyExpress(id);
break;
case 4:
cabinet.viewAll();
break;
case 5:
break use;
default:
break;
}
}
input.close();
}
执行结果:
请输入您要进行的操作(1、录入快递 2、删除快递 3、修改快递 4、查看所有快递):
2
请输入您要删除的快递的单号:
执行删除操作
删除操作结束
请输入您要进行的操作(1、录入快递 2、删除快递 3、修改快递 4、查看所有快递):
3、错误分析
由结果可以看得出,当输入2之后,我们希望看到的结果是接下来进行输入快递单号的操作,但是实际情况却是我们还为输入快递单号,这一步就直接执行完了。其原因是因为nextInt(),与nextLine()方法一前一后同时使用了,虽然在程序中我们可能感觉不到,但是逻辑上确是如此,当上述两方法同时使用就回发生nextInt()接收的是正常的,而nextLine()方法接收到了前面nextInt()输入后的回车,这也是为什么程序不等我们输入快递单号就直接执行完成的原因!
4、解决办法
不想要我们后面的nextLine()方法接收到上一个nextInt()输入的回车,最好的办法就是在nextInt()方法之后再加nextLine(),用于专门接收回车。
修改后的代码如下:
public void use(Cabinet cabinet) {
Scanner input = new Scanner(System.in);
int choose;
use:while(true) {
System.out.println("请输入您要进行的操作(1、录入快递 2、删除快递 3、修改快递 4、查看所有快递): ");
if(input.hasNextInt()) {
choose = input.nextInt();
input.nextLine(); //在nextInt()后写一个nextLine()专门用于接收回车
if(choose>5 || choose<1) {
System.out.println("输入有误,请重新输入");
continue;
}
}else {
System.out.println("输入有误,请重新输入");
continue;
}
String id = "";
switch (choose) {
case 1:
cabinet.addExpress();
break;
case 2:
System.out.println("请输入您要删除的快递的单号:");
id = input.nextLine();
cabinet.deleteExpress(id);
break;
case 3:
System.out.println("请输入您要修改的快递的单号:");
id = input.nextLine();
cabinet.modifyExpress(id);
break;
case 4:
cabinet.viewAll();
break;
case 5:
break use;
default:
break;
}
}
input.close();
}