当我们在使用控制台输入操作时,最常用到的是扫描器Scanner工具类,但一般使用该类都忘记了关闭资源,最近写代码时特意每次使用都执行了关闭操作,结果出现了异常NoSuchElementException,以下是具体异常和解决方法。
异常发生场景:
1、当同一个类中使用了2个至多个Scanner对象,当执行过程中关闭了其中一个,在使用其他的对象时异常。
2、当一个类(该类要使用的Scanner对象方法)调用另个一类(该类也要使用的Scanner对象方法,且使用完执行了关闭资源操作)时发生异常。
虽然发生场景不同,但异常都是NoSuchElementException(没有这样的元素异常)。
异常原因分析和解决:
原因:当我们点开System.in的源码时会发现,in是由final static修饰的静态常量,是个输入流,存储在虚拟机中的方法区,该区域存储内容为线程共享,所以当执行过程中有一次执行了关闭资源操作时,把System.in输入流资源也关闭了,接下来其他Scanner扫描器自然也就没法继续使用。
解决:只要在确保是最后一次使用Scanner扫描器后关闭就行了,也可以都不关,不用管其他类有警告(感叹号)。
简单的测试代码:
import java.ut