做实验时设计了一个类,在类中的两个不同函数中分别创建了两个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。 |