2013-01-19 45 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