首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Scanner.close() 導致 NoSuchElementException 的根因與修正

     編輯:程式設計綜合問答

問題現象

在循環中多次 `new Scanner(System.in)` 並 `close()`,第二次讀取拋出 `NoSuchElementException`。

根本原因

  • Scanner.close() 會關閉底層的 InputStream(即 System.in)。
  • System.in 是進程級單例,關閉後無法重新打開,後續任何讀取操作均會失敗。

錯誤代碼模式

while (true) {
    Scanner s = new Scanner(System.in);
    int x = s.nextInt();
    s.close(); // 錯誤:關閉了 System.in
}

正確做法

方案一:全程使用單一 Scanner(推薦)

Scanner scanner = new Scanner(System.in);
while (running) {
    int x = scanner.nextInt();
    // ...
}
// 程式結束前關閉
scanner.close();

方案二:不關閉 System.in,僅在程式退出時關閉

若必須分離邏輯,可傳遞 Scanner 實例,或使用 BufferedReader 包裝 System.in(同樣不可關閉底層流)。

方案三:針對檔案/網絡流才需嚴格 close

對於 System.in、System.out 等標準流,JVM 退出時自動回收,業務代碼通常不需要顯式關閉。

代碼中其他問題

  • i4、j9 疑為 i > 4、j > 9 的轉義錯誤,需修正邊界判斷。
  • 自定義異常 OutIndexOfException 建議繼承 RuntimeException 簡化處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved