java.util.NoSuchElementException
问题引入
Java商店作业不同函数里需要获取用户输入,用Scanner
的时候,出现了异常java.util.NoSuchElementException
作业中代码模式如下,func1
和func2
中都使用Scanner
并关闭它。然后在main中依次调用func1
和func2
,func2
产生异常。说func1
和func2
其实不合适,应该加个括号.....…..懒得加了
//Demo.java
import java.util.Scanner;
class Test{
void func1() {
Scanner sc=new Scanner(System.in);
//输出用户输入,替代作业里的使用Scanner
System.out.print("Func1请输入内容:");
System.out.println("Func1输出"+sc.next());
//关闭Scanner
sc.close();
}
void func2() {
Scanner sc=new Scanner(System.in);
//输出用户输入,替代作业里的使用Scanner
System.out.print("Func2请输入内容:");
System.out.println("Func2输出"+sc.nextInt());
//关闭Scanner
sc.close();
}
}
public class Demo{
public static void main(String[] args) {
Test t=new Test();
t.func1();
t.func2();
}
}
/*Console输出如下:
Func1请输入内容:小姐,请问你喜欢吃青椒吗?
Func1输出:小姐,请问你喜欢吃青椒吗?
Func2请输入内容:Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Unknown Source)
at java.base/java.util.Scanner.next(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at Test.func2(Demo.java:21)
at Demo.main(Demo.java:31)
*/
异常产生原因
func1
中sc.close();
语句关闭了Scanner
,func2
中使用Scanner
产生异常
因为System.in
是System
类的静态成员,所以不同Scanner
对象内的in是同一个
in`
func1
和func2
中都用System.in
创建了Scanner
func1
打开Scanner
后将其关闭,这里间接地将System.in
也关闭了
func1
结束后运行func2
,这时再调用nextInt
,在System.in
已经关闭了的情况下,不能读取到任何数据,就会产生 java.util.NoSuchElementException
解决方法
系统资源一旦释放就不能再开启了,所以只有确定不在使用系统的时候,才能将流关闭
所以应该在整个程序结束时释放Scanner
等资源,而不是某个函数中每次使用Scanner
等资源后都释放一次
问题引入中的代码只是个模式,上边的两句话用在作业实际代码里就好了
代码分析
Scanner()
创建Scanner
对象代码为Scanner sc=new Scanner(System.in);
构造函数源码如下
public Scanner(InputStream source) {
this(new InputStreamReader(source), WHITESPACE_PATTERN);
}
可看出是调用了另外一个构造函数,继续查看源码
private Scanner(Readable source, Pattern pattern) {
assert source != null : "source should not be null";
assert pattern != null : "pattern should not be null";
this.source = source; //看这句
delimPattern = pattern;
buf = CharBuffer.allocate(BUFFER_SIZE);
buf.limit(0);
matcher = delimPattern.matcher(buf);
matcher.useTransparentBounds(true);
matcher.useAnchoringBounds(false);
useLocale(Locale.getDefault(Locale.Category.FORMAT));
}
至少知道了Scanner
内部还是用到了流,算是对流进行了封装吧,使用起来更方便一些
close()
调用语句为sc.close();
,查看close()
源码,如下
public void close() {
if (closed) //1.通过closed标志校验Scanner是否已关闭;
return;
if (source instanceof Closeable) { //2.执行source的close()方法,
try { //将source关闭(这里为System.in);
((Closeable)source).close();
} catch (IOException ioe) {
lastException = ioe;
}
}
sourceClosed = true; //3.将sourceClosed标志设置为true,表示source已关闭;
source = null; //4.将source置为null,不再引用,处于可回收状态;
closed = true; //5.将closed标志设置为true,表示Scanner已关闭;
}
可以知道关闭Scanner
的时候,((Closeable)source).close();
把System.in
关闭了
关闭后下次想再使用就当然有错了~(除非构造函数里还再把in
给打开,但这样也不太合理)
其实如果还可以再仔细看看Scanner
的构造方法,和Scanner
的next()
,能力有限,点到为止
作者:@臭咸鱼
本文为作者原创,转载请注明出处:https://chouxianyu.github.io/2018/11/03/java.util.NoSuchElementException/#more
欢迎转发和评论
java.util.NoSuchElementException的更多相关文章
- 解决:Redis:java.util.NoSuchElementException: Unable to validate object at
在Java使用Redis的过程中遇见了一个问题, redis.clients.jedis.exceptions.JedisConnectionException: Could not get a re ...
- Java学习笔记之Scanner报错java.util.NoSuchElementException
转载自:IT学习者-螃蟹 一个方法A使用了Scanner,在里面把它关闭了.然后又在方法B里调用方法A之后就不能再用Scanner了Scanner in = new Scanner(System.in ...
- java.util.NoSuchElementException错误原因及解决方案
1.原因:没有控制语句导致的迭代器的越界,使得map中的数据无法传入reduce,从而无法把结果传入目标文件中. 在进行Mapreduce实例——WordCount实验时遇到的错误,开始以为是lib包 ...
- redis异常Redis:java.util.NoSuchElementException: Unable to validate object at
前两天项目上线的时候遇到了redis的一个问题,在测试环境的时候项目运行正常,项目一上线redis便开始抛异常. redis.clients.jedis.exceptions.JedisConnect ...
- 【spring data jpa】启动报错:nested exception is java.util.NoSuchElementException
spring boot项目中 使用spring data jpa 启动报错: org.springframework.beans.factory.UnsatisfiedDependencyExcept ...
- Java标准输入流system.in报错: java.util.NoSuchElementException解决方法
我的程序大概是这样的: main()主函数里面,调用两个自定义的方法,这里我们称之为方法a和方法b: 主函数main()里有一个:Scanner scanner = new Scanner(Syste ...
- Android 关于java.util.NoSuchElementException错误
写了一个从A文件复制到B文件的例子,其中要求去掉重复的行. 于是想到了Set,这本来是很容易的事情,结果在向外写数据时抱错 Java.util.NoSuchElementException 网络上反复 ...
- maven项目新检出后不编译爬坑记 及 mvn clean package报错 WagonTransporterFactory: java.util.NoSuchElementException 异常【我】
从SVN新检出一个maven项目,配置好后,发现项目无法编译(只有一个test包中的代码显示编译报错,其他所有包中的代码都不编译,也不报错), 先注释掉报错的test包中的所有内容, 用Eclipse ...
- java.util.NoSuchElementException: No value present
错误: java.util.NoSuchElementException: No value present 原因: 经查询博客Java 8 Optional类深度解析发现,究其原因为: 在空的Opt ...
随机推荐
- Apache Jmeter教程(一) - 入门
一.下载Jmeter 登录官网Jmeter下载,得到压缩包jmeter-5.0.tgz,下载地址:http://jmeter.apache.org/download_jmeter.cgi. 二.安装 ...
- 2019Java常见面试下
1.集合的作用是什么? 数据的传送增.删.改.查.constainsAll,可以存放不同类型的对象. 2.集合的通用方法有那些?通用方法是什么?(操作) 集合List的遍历方法有: Iterator: ...
- 详解Arduino Uno开发板的引脚分配图及定义(重要且基础)
首先开发板实物图如下: 在本篇文章中,我们将详细介绍Arduino开发板的硬件电路部分,具体来说,就是介绍Arduino Uno开发板的引脚分配图及定义.Arduino Uno微控制器采用的是Atme ...
- HttpHelper帮助类
public class HttpHelper { #region 预定义方变量 //默认的编码 private Encoding _encoding = Encoding.Default; //Po ...
- Windows远程连接server(Linux系统)及可视化
方法1:命令行连接后使用server上安装好的可视化编辑器IDE: Step 1: 工具准备:putty.exe:Xming-6-9-0-31-setup.exe:Xming-fonts-7-7-0- ...
- VS2013 + Nunit 安装搭建
Nunit 官方给我提供了Nunit 3的四种安装方式 第一种 通过NuGet进行Full Nunit安装 第二种 通过NuGet进行轻量级 NunitLite 安装 第三种 通过Zip 压缩包下载安 ...
- MyBatis 源码篇-DataSource
本章介绍 MyBatis 提供的数据源模块,为后面与 Spring 集成做铺垫,从以下三点出发: 描述 MyBatis 数据源模块的类图结构: MyBatis 是如何集成第三方数据源组件的: Pool ...
- 怎样使用yum安装nginx
yum install -y nginx 以上.
- 怎样创建一个canvas画布环境
1. 由于canvas画布在网页中, 所以需要在html中添加canvas标签: <!DOCTYPE html> <html lang="en"> < ...
- Java浅拷贝与深拷贝(思维导图)
图1 拷贝思维导图(点击查看图片) 1,拷贝 有两个相同属性的对象A和B,A拥有初始化值,将其值拷贝到B中,使得B拥有与A“相同”数据的属性!注意这里的相同我有加双引号! 相同可能表示这么几个意思:① ...