2014-02-11 49 views
2
package sandbox2; 

import java.util.Scanner; 

public class Sandbox2 
{ 
    public static void main(String[] args) 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      String s = askForProperty("Enter value for " + i + ": "); 
      System.out.println(i + " is: " + s); 
     } 

    } 

    private static String askForProperty(String message) 
    { 
     Scanner keyboard = new Scanner(System.in); 
     System.out.print(message); 
     String s = keyboard.nextLine(); 
     keyboard.close(); 

     return s; 
    } 
} 

當我運行上面的代碼,它返回第一個響應PERFECTLY。當它試圖索要第二響應,它返回:問題與java掃描程序不採取nextLine新實例

java.util.NoSuchElementException: No line found 

爲什麼會返回此錯誤?每次調用askForProperty方法時,Scanner都是一個全新的實例!它與System.in有什麼關係作爲輸入流?

+1

你爲什麼選擇每次迭代創建一個新的掃描儀?我相信問題在於,當你調用'keyboard.close'時,你正在關閉'System.in'。如果你只是製作一臺掃描儀,並在所有迭代完成後關閉它,你應該沒問題。 – csmckelvey

+0

這似乎是合理的。我相信close()方法會關閉資源依賴的其他任何東西。我試圖減少代碼,因爲我需要許多用戶輸入,並且不需要加載println語句。 – Drifter64

回答

0

將您的掃描儀定義爲類變量,然後只有在完成所有迭代後才關閉它。在您當前的設置中,當您撥打keyboard.close時,您也將關閉System.in,這會使其稍後不能使用。

package sandbox2; 
import java.util.Scanner; 

public class Sandbox2 { 
    static Scanner keyboard = new Scanner(System.in); // One instance, available to all methods 

    public static void main(String[] args) { 
     for (int i = 0; i < 5; i++) { 
      String s = askForProperty("Enter value for " + i + ": "); 
      System.out.println(i + " is: " + s); 
     } 
     keyboard.close(); //Only close after everything is done. 
    } 

    private static String askForProperty(String message) { 
     System.out.print(message); 
     String s = keyboard.nextLine(); 
     return s; 
    } 
} 
+0

這實際上是沿着我所思考的方向的東西,除了我並沒有考慮讓它始終保持開放。 – Drifter64

+1

如果它不起作用(我測試了幾次,它應該爲你工作)讓我知道你遇到什麼問題。 – csmckelvey

0

關閉一個Scanner使底層InputStream被也被關閉。由於只有一個System.in,任何新創建的掃描對象將不能從相同流中讀取:

keyboard.close(); 

關閉在最後Scanner

0

所以,

在你的代碼的主要問題是,您創建,並在每一次迭代立即關閉Scanner。這根本行不通。設想Scanner作爲一個很大的連接到你的IO,需要相當的組合。如果每次都打開/關閉它 - 您可能會發現在連接再次打開之前下一個命令被觸發的情況。這與您在數據庫連接中可能找到的內容非常相似。防止它的方法是在開始迭代之前讓Scanner打開,完成循環並關閉它。

因此,從askForProperty()函數中刪除close()語句並將其移動到main。將掃描儀鍵盤對象傳遞給該函數。一旦所有的迭代結束 - 然後關閉它。

import java.util.Scanner; 

public class Sandbox2 
{ 
    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); // Initialize the Scanner 
     for (int i = 0; i < 5; i++) 
     { 
      String s = askForProperty("Enter value for " + i + ": ", keyboard); // Pass the Scanner 
      System.out.println(i + " is: " + s); 
     } 
     keyboard.close(); // Close the Scanner now that the work is done. 
    } 

    private static String askForProperty(String message, Scanner keyboard) 
    { 
     System.out.println(message); 
     String s = keyboard.nextLine(); 
     return s; 
    } 
}