2014-09-20 40 views
-1

为什么这个代码在我输入值的时候会抛出一个异常,如果使用它的话它会在里面。如果里面试着抓住while循环里面的内容NoSuchElementException

异常消息:在线程

异常 “主要” 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"); 
    } 
+0

大概是因为它从'in'中读取的下一个标记不是'int'。没有更多的信息就无法说出来。 (我认为这将是空格,但'扫描仪'文档说空格是默认的分隔符,所以大概不会是这样的......) – 2014-09-20 10:34:59

+0

*“...当我输入值更多然后它是内部如果用过。“*咦? – 2014-09-20 10:37:39

+0

@ T.J.Crowder我认为当输入不是1,2和3时,我在http://ideone.com/4lRySS运行他的代码,你可以去那里测试它。他是对的,我不知道为什么? – Lrrr 2014-09-20 10:43:32

回答

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

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

如果这个扫描器还没有关闭,那么如果它的底层可读也实现了可关闭接口,那么可读的关闭方法将被调用。

由于System.inInputStream类型的,因此实现了Closeable,关闭扫描器关闭底层标准输入流。

然后,当您下一次尝试使用System.in创建扫描仪时,后者将已关闭。这就是你得到例外的原因。

如果你想跳过非整数的输入,你最好创建一个一次以外的循环,然后只是读取值而不关闭,使用类似nextLine()

0

只要删除in.close();,它会工作。