我经常遇到这个问题。当我多次使用扫描仪时,它无法从用户那里获得输入。
Scanner scan = new Scanner(System.in);
System.out.println("1---");
int try1 = scan.nextInt();
System.out.println("2---");
int try2 = scan.nextInt();
System.out.println("3---");
String try3 = scan.nextLine();
System.out.println("4---");
String try4 = scan.nextLine();
当我运行此代码时,结果:
1 ---
12
2 ---
321
3 ---
4 ---
AA
正如您所看到的,它跳过第3个输入。为什么会这样?我使用新的扫描仪解决了这个问题,有时我有5-6种不同的扫描仪,看起来很复杂。 另一个问题是:出现错误"资源泄漏:扫描永远不会关闭"。我真的很困惑。
答案 0 :(得分:6)
问题在于,使用scanner.nextInt()
只能读取一个整数值,而不是整行,并且您不会使用附加到该行的换行符(\n
)当您按 Enter 。
然后,当您使用scanner.nextLine()
处理阅读时,您会使用换行符(\n
)并从上一行开始阅读您想要阅读的行。为了强制它读取它,您必须添加一个额外的input.nextLine()
语句。
System.out.println("2---");
int try2 = scan.nextInt();
System.out.println("3---");
scan.nextLine(); //<-- fake statement, to move the cursor on the next line
String try3 = scan.nextLine();
与问题无关,您必须在完成工作后关闭Scanner
,否则编译器会发出警告:
scan.close();
答案 1 :(得分:2)
使用下一个API而不是nextLine,就像当你执行nextInt时按Enter键,它会生成数字+ \ n而nextInt只会取一个整数并且不会取\ n而后者会转到下一个输入即try3,这就是它被跳过的原因。
Scanner scan = new Scanner(System.in);
System.out.println("1---");
int try1 = scan.nextInt();
System.out.println("2---");
int try2 = scan.nextInt();
System.out.println("3---");
String try3 = scan.next();
System.out.println("4---");
String try4 = scan.next();
答案 2 :(得分:0)
好吧,对于第一个使用问题
scan.next()
使用
scan.nextLine();
对于第二个问题,我建议使用try,假设您需要关闭扫描,因为编译器警告:“资源泄漏:扫描永远不会关闭”
Scanner scanner= null;
try {
scanner= new Scanner(System.in);
}
finally {
if(scanner!=null)
scanner.close();
}