做實驗時設計了一個類,在類中的兩個不同函數中分別創建了兩個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。