Java:只用一个Scanner对象处理一个循环内的Scanner Scanner输入

时间:2016-06-01 14:45:25

标签: java exception-handling java.util.scanner

下面的代码是否能够正确运行而不在循环中创建新的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();
  }
}

1 个答案:

答案 0 :(得分:1)

在循环外部定义Scanner时,每次循环运行时都使用相同的扫描程序。如果下一个令牌不是有效整数,则sc.nextInt()将失败并且扫描程序将不会超出该令牌。在下一次迭代中,sc.nextInt()将看到相同的无效令牌,并将再次失败。同样,如果关闭扫描仪,循环的下一次迭代将在关闭的扫描仪上调用sc.nextInt(),这将失败。由于同样的原因,后续迭代将失败。

另一方面,当在循环内定义扫描仪时,每次迭代都使用新的扫描仪。即使sc.nextInt()失败,下一次迭代也会使用不包含相同无效令牌的新扫描程序。