Java 使用Scanner時的NoSuchElementException異常


  做實驗時設計了一個類,在類中的兩個不同函數中分別創建了兩個Scanner對象,並且在各個函數的結尾使用了close()方法,結果在運行時產生了NoSuchElementException異常。

  實驗的中的類和下方代碼差不多,記錄一下異常的原因。

 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main {
 6 
 7     public static void main(String[] args) {
 8         Info info = new Info();  //實例化Info對象,調用兩個方法
 9         info.test1();
10         info.test2();
11     }
12 
13 }
14 
15 class Info{
16 
17     public void test1(){
18         Scanner scan = new Scanner(System.in);  //創建第一個Scanner對象
19         String info = scan.next();
20         System.out.println(info);
21         scan.close();                 //在結尾使用close()關閉Scanner
22     }
23 
24     public void test2(){
25         Scanner scan2 = new Scanner(System.in);  //第二個Scanner對象
26         String info = scan2.next();
27         System.out.println(info);
28         scan2.close();
29     }
30 }

運行結果:

12
12
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at Test.Info.test2(Main.java:26)
at Test.Main.main(Main.java:10)

Process finished with exit code 1

===============================================================

  在網上查找資料后發現,System.in在源碼中是這樣定義的:

    public final static InputStream in = null;

  System.in是靜態的,當前類中所有System對象共享,在使用close()方法時,會同時關閉Scanner和System.in,而System.in關閉后不能再打開,當第二個函數再次想實例化Scanner時就會拋出NoSuchElementException異常。

  解決方法是在主方法中調用方法時在參數中傳入Scanner對象,或者在類中最后關閉Scanner。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM