2013-01-19 32 views
1

这一段简单的代码中使用时java.util.Scanner中的异常行为:与System.in

import java.util.Scanner; 

public class TestScanner { 

    public static void main(String[] args){ 

     Scanner sc1 = new Scanner(System.in); 
     int number1 = sc1.nextInt(); 
     sc1.close(); 

     Scanner sc2 = new Scanner(System.in); 
     int number2 = sc2.nextInt(); 
     sc2.close(); 
    } 

} 

总是给我这个错误:

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Scanner.java:838) 
    at java.util.Scanner.next(Scanner.java:1461) 
    at java.util.Scanner.nextInt(Scanner.java:2091) 
    at java.util.Scanner.nextInt(Scanner.java:2050) 
    at mainpkg.TestScanner.main(TestScanner.java:14) 

这其中也不起作用。这次它陷入了一个永无止境的循环!

import java.util.Scanner; 

public class TestScanner { 

    public static void main(String[] args){ 

     Scanner sc1 = new Scanner(System.in); 
     int number1 = sc1.nextInt(); 
     sc1.close(); 

     Scanner sc2 = new Scanner(System.in); 
     while(!sc2.hasNextInt()) 
      ; 
     int number2 = sc2.nextInt(); 
     sc2.close(); 
    } 

} 

为什么?

+0

我希望有一个很好的理由可以对这个问题投下赞成票! – RGO

回答

2

问题是sc1.close();关闭了基础流。第二次,你试图从封闭的流中读取,所以它显然失败了。

+0

这是否意味着'扫描仪'关闭后,它不能再次使用或有任何解决方案吗? – RGO

+0

@Reza err ...不要关闭扫描仪? – Doorknob

+2

我想一旦System.in被关闭,你就不能再使用它了。解决方案是只使用一台扫描仪。 – aditsu

0

你应该检查每一个hasNextInt,而不是只是假设有更多的阅读。

+0

它不适合我。你能在这里写一个有效的代码吗? – RGO

+2

@Reza:我不会为你写代码。我建议参考一本关于Java的书,或者可能是一本教程,例如http://docs.oracle.com/javase/tutorial/essential/io/scanning.html。 –

+0

那里没有提到这样的问题。这就是我在这里问的原因。 'hasNextInt'无法解决问题(我不能,请参阅更新) – RGO