Java通过系统类System实现标准输入/输出的功能
我们经常通过实例化Scanner类的方式实现从键盘的数据输入
但其中的如果对其中一些细节不了解,就会引发不能理解的错误
比如close方法:
import java.util.Scanner; public class CloseTest { public static void main(String[] args){ Scanner in = new Scanner(System.in); int a = in.nextInt(); System.out.println(a); in.close(); Scanner in_2 = new Scanner(System.in); int b = in_2.nextInt(); System.out.println(b); in_2.close(); } }
输入1后的结果:
1
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at test.CloseTest.main(CloseTest.java:13)
在创建Scanner类对象in后,实现了输入,试图调用close方法关闭输入流,再创建一个新的Scanner对象,
在int b = in_2.nextInt();一句出现错误。
这是因为创建的in和in_2对象都是有System.in封装而来的,虽然是两个独立的对象,但是用的是同一个输入流
在调用in.close()实际上相当于System.in.close()
扫描二维码关注公众号,回复:
1626632 查看本文章
对于创建的in_2来说,System.in已经被关闭了。
import java.util.Scanner; public class CloseTest { public static void main(String[] args){ Scanner in = new Scanner(System.in); Scanner in_2 = new Scanner(System.in); System.out.println(in); System.out.println(in_2); } }
执行此段代码,可以发现结果:
java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\,][decimal separator=\.][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q?\E][infinity string=\Q∞\E] java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\,][decimal separator=\.][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q?\E][infinity string=\Q∞\E]
in和in_2的地址是相同的,指向了同一块区域
简单的解决方式:
在所有其他的类中不使用使用close()方法
然后在包含主函数的类中创建Scanner对象,在代码的最后调用close()