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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!