[英]How do I close a scanner in 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();
但當我刪除它時,我收到警告:
資源泄漏:“input_scanner”永遠不會關閉“
無論如何,我可以阻止錯誤發生並擺脫警告?
好吧,首先我建議您使用API來了解Java向您展示的異常。
有關NoSuchElementException的更多信息,請閱讀此內容:
http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html
當您使用scanner,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()
關閉掃描儀。
您應該檢查是否有使用hasNextLine
api為Scanner使用的數據,您可以這樣做:
String string = "";
if (input_scanner.hasNextLine()) {
string = input_scanner.nextLine();
}
使用try-with-resources保證掃描儀關閉,無論是否發生異常。
try (Scanner input_scanner = new Scanner(System.in)) {
.
.
.
}
你可以將它與任何實現AutoCloseable的東西一起使用,並且比關閉時拋出的異常需要一堆try-catch要好得多。
實際上,由於您使用的是Scanner for System.in,這意味着它是一個阻塞調用,直到它收到用戶的第一個輸入為止。 作為一個局部變量,你真的不需要關閉掃描器,你肯定不需要hasNextLine()的while循環;
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;
掃描操作可能阻止等待輸入。 如果沒有接收到輸入,那么scanner對象不必讀取哪個使得拋出異常,因為它沒有找到需要關閉的元素。 通過驗證流是否包含掃描對象可以讀取的任何內容將幫助您獲得此類異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.