下面的代码是否能够正确运行而不在循环中创建新的Scanner对象?
只需在循环外部定义一个Scanner对象(注释代码)吗?
// Scanner sc = new Scanner(System.in);
while(true){
Scanner sc = new Scanner(System.in);
try{
int x = sc.nextInt();
System.out.printf("You gave %d\n", x);
}catch(Exception e){
System.out.println("Plz give a valid number!");
}finally{
sc.close();
}
}
答案 0 :(得分:1)
在循环外部定义Scanner
时,每次循环运行时都使用相同的扫描程序。如果下一个令牌不是有效整数,则sc.nextInt()
将失败并且扫描程序将不会超出该令牌。在下一次迭代中,sc.nextInt()
将看到相同的无效令牌,并将再次失败。同样,如果关闭扫描仪,循环的下一次迭代将在关闭的扫描仪上调用sc.nextInt()
,这将失败。由于同样的原因,后续迭代将失败。
另一方面,当在循环内定义扫描仪时,每次迭代都使用新的扫描仪。即使sc.nextInt()
失败,下一次迭代也会使用不包含相同无效令牌的新扫描程序。