2015-04-25 52 views
3

當過我運行下面的代碼,如何在java中關閉掃描器?

private static String input(String Message){ 
    Scanner input_scanner = new Scanner(System.in); 
    System.out.print("\n" + Message); 
    String string = input_scanner.nextLine(); 
    input_scanner.close(); 
    return string; 
} 

我得到這個錯誤:

Exception in thread "main" java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Unknown Source) 
    at main.learn.input(learn.java:25) 
    at main.learn.main(learn.java:13) 

我想通了,這是什麼做的線input_scanner.close();但是當我刪除它,我得到的警告說:

Resource leak: "input_scanner" is never closed"

是否有反正我可以阻止錯誤發生並擺脫警告?

+1

我不認爲你可以使用'System.in'多個掃描儀可靠。如果你關閉它,那麼你關閉'System.in' ...如果你不這樣做,那麼你創建的第二個掃描器可能不會從第一個掃描器離開的位置開始(因爲第一個掃描器可能已經緩衝了一些行) – immibis

回答

3

你應該檢查是否有數據要使用hasNextLine API進行掃描消耗,你可以做這樣的:

String string = ""; 
if (input_scanner.hasNextLine()) { 
    string = input_scanner.nextLine(); 
} 
+0

if你真的需要輸入,那麼你應該使用while循環。現在它會檢查你是否有任何數據要消耗,如果沒有,那麼它將返回一個空字符串。 – SMA

8

首先,我建議你使用的API理解的Java顯示您的異常。

閱讀本之進一步資料NoSuchElementException異常:
http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html

當您使用掃描儀,StringTokenizer的,迭代器......你要確認你有更多的元素,你嘗試閱讀前仔細閱讀。如果你不這樣做,你可以得到這種類型的例外。

private static String input(String Message){ 
    Scanner input_scanner = new Scanner(System.in); 
    System.out.print("\n" + Message); 
    if (input_scanner.hasNextLine()){ 
     String string = input_scanner.nextLine(); 
    } 
    input_scanner.close(); 
    return string; 

如果你想讀的多條線路,使用while (input_scanner.hasNextLine())

你的錯誤是對鍵盤輸入。閱讀以瞭解您是否做得很好: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextLine%28%29

PS:建議您在完成後使用input_scanner.close()關閉掃描儀。

2

使用try-with-resources保證您的掃描儀關閉,無論是否有任何異常發生。

try (Scanner input_scanner = new Scanner(System.in)) { 
    . 
    . 
    . 
} 

可以與任何實現AutoCloseable使用,這是不是需要一堆的try-catch的關閉時拋出的異常要好得多。

+0

'Closeable'應該是'AutoCloseable' – tomse

1

實際上,由於您正在使用Scanner for System.in,這意味着它是一個阻塞呼叫,它將一直保持到接收到用戶的第一個輸入爲止。 作爲一個局部變量,你並不需要關閉掃描器,並且你肯定不需要whileNext循環來處理hasNextLine();

private static String input(String Message){ 
Scanner input_scanner = new Scanner(System.in); 
System.out.print("\n" + Message); 
String string = input_scanner.nextLine(); 
return string; 
1

掃描操作可能會阻止等待輸入。如果沒有接收到輸入,那麼掃描器對象不必讀取哪個引發Exception,因爲它沒有找到需要關閉的元素。通過驗證流是否包含可以通過掃描對象讀取的內容,可以幫助您獲取這種異常。