2015-02-08 46 views
2

我試圖創建一個非常簡單的程序(它並不重要,但是一個掃雷遊戲),並且我遇到了以下問題:當我嘗試(Scanner),它第一次工作(第一回合),但在第二回合,按輸入後,它會拋出以下異常:java.util.NoSuchElementException: No line foundjava.util.NoSuchElementException:No line found - 讀取用戶輸入只能使用一次

兩回合之間沒有任何變化,我在每一回合創建一個新的Scanner實例。

代碼:

public String nextTurn() { 
    Scanner scn = new Scanner(System.in); 

    System.out.print("Please insert your action: "); 
    StringTokenizer input = new StringTokenizer(scn.nextLine()); 
    scn.close(); 
    //... 
} 

再次,它工作時,我稱這種方法爲第一次,但失敗的第二個呼叫。你有一個想法可能是什麼問題?

+1

像你這樣打開和關閉'System.in'是很危險的。我建議你爲此目的和你的整個程序創建一個基於System.in的掃描器,並將它作爲參數傳遞給方法。此外,即使使用不同的掃描儀對象完成掃描,以前掃描的令牌也可能很重要。 – 2015-02-08 14:27:05

回答

4

System.in是一個輸入流,可以輸入所有控制檯輸入。

就像任何輸入流一樣,它可以被關閉。用戶可以將其關閉(按CTRLdCTRLž),但你也可以關閉它編程 - 這是一個Closeable對象。

當您擁有基於輸入流的掃描儀並關閉掃描儀時,它也會自動關閉位於其後面的輸入流。也就是說,您第一次關閉scn時,您已關閉System.in

下次您在System.in上創建掃描儀時,它基本上是封閉流中的掃描儀。當您嘗試調用任何nextXXX方法時,它會告訴您流中不存在這樣的元素。這是因爲該流已經關閉。

你應該做的是在你的程序開始時只打開一次掃描儀,然後關閉它一次 - 在程序結束時。您可以繼續使用相同的掃描儀 - 實際上,不需要爲相同的輸入流打開多個掃描儀。