如果里面的try catch里面是while循环NoSuchElementException

时间:2014-09-20 10:29:46

标签: java exception

为什么这个代码会在我输入更多值时引发异常,如果使用它就会在内部。

异常消息:

  

线程中的异常" main" java.util.NoSuchElementException

我的代码:

while (true) {
    try {
        Scanner in = new Scanner(System.in);
        int choose = in.nextInt();
        in.close();
        if (choose == 1 || choose == 2 || choose == 3) {
            return choose;
        }
        else
        {
            System.out.println("else text");
        }
    } catch (InputMismatchException e) {
        System.out.println("exception text");
    }

3 个答案:

答案 0 :(得分:2)

如果您关闭System.in,则无法重新打开它。删除close()调用以解决此问题。您也可以将Scanner对象移出循环。无需在每次迭代中创建它。

final Scanner in = new Scanner(System.in);
while (true) {
  try {
    int choose = in.nextInt();
    if (choose == 1 || choose == 2 || choose == 3) {
      return choose;
    } else {
      System.out.println("else text");
    }
  } catch (InputMismatchException e) {
    System.out.println("exception text");
  }
}

答案 1 :(得分:1)

Scanner.close()包含这个小片段(我的粗体):

  

如果此扫描程序尚未关闭,则如果其底层可读也实现了Closeable接口,则将调用可读的close方法。

由于System.in的类型为InputStream,因此会实现Closeable,因此关闭扫描程序也会关闭基础标准输入流。

然后,下次尝试使用System.in创建扫描程序时,后者将已关闭。 _那就是你获得例外的原因。

你最好在循环外创建一次扫描器,然后只是在没有关闭的情况下读取值,如果你想跳过输入而不是nextLine()一个整数。

答案 2 :(得分:0)

只需删除in.close();即可。