问题引入

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的更多相关文章

  1. 解决:Redis:java.util.NoSuchElementException: Unable to validate object at

    在Java使用Redis的过程中遇见了一个问题, redis.clients.jedis.exceptions.JedisConnectionException: Could not get a re ...

  2. Java学习笔记之Scanner报错java.util.NoSuchElementException

    转载自:IT学习者-螃蟹 一个方法A使用了Scanner,在里面把它关闭了.然后又在方法B里调用方法A之后就不能再用Scanner了Scanner in = new Scanner(System.in ...

  3. java.util.NoSuchElementException错误原因及解决方案

    1.原因:没有控制语句导致的迭代器的越界,使得map中的数据无法传入reduce,从而无法把结果传入目标文件中. 在进行Mapreduce实例——WordCount实验时遇到的错误,开始以为是lib包 ...

  4. redis异常Redis:java.util.NoSuchElementException: Unable to validate object at

    前两天项目上线的时候遇到了redis的一个问题,在测试环境的时候项目运行正常,项目一上线redis便开始抛异常. redis.clients.jedis.exceptions.JedisConnect ...

  5. 【spring data jpa】启动报错:nested exception is java.util.NoSuchElementException

    spring boot项目中 使用spring data jpa 启动报错: org.springframework.beans.factory.UnsatisfiedDependencyExcept ...

  6. Java标准输入流system.in报错: java.util.NoSuchElementException解决方法

    我的程序大概是这样的: main()主函数里面,调用两个自定义的方法,这里我们称之为方法a和方法b: 主函数main()里有一个:Scanner scanner = new Scanner(Syste ...

  7. Android 关于java.util.NoSuchElementException错误

    写了一个从A文件复制到B文件的例子,其中要求去掉重复的行. 于是想到了Set,这本来是很容易的事情,结果在向外写数据时抱错 Java.util.NoSuchElementException 网络上反复 ...

  8. maven项目新检出后不编译爬坑记 及 mvn clean package报错 WagonTransporterFactory: java.util.NoSuchElementException 异常【我】

    从SVN新检出一个maven项目,配置好后,发现项目无法编译(只有一个test包中的代码显示编译报错,其他所有包中的代码都不编译,也不报错), 先注释掉报错的test包中的所有内容, 用Eclipse ...

  9. java.util.NoSuchElementException: No value present

    错误: java.util.NoSuchElementException: No value present 原因: 经查询博客Java 8 Optional类深度解析发现,究其原因为: 在空的Opt ...

随机推荐

  1. 【DSP开发】帮您快速入门 TI 的 Codec Engine

    德州仪器半导体技术(上海)有限公司 通用DSP 技术应用工程师 崔晶 德州仪器(TI)的第一颗达芬奇(DaVinci)芯片(处理器)DM6446已经问世快三年了.继DM644x之后,TI又陆续推出了D ...

  2. 巧用 Class Extension 隐藏属性

    一般来说,Extension用来给Class增加私有属性和方法,写在 Class 的.m文件.但是Extension不是必须要写在.m文件,你可以写在任何地方,只要在 @implementation  ...

  3. codevs 1200:同余方程

    题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空 ...

  4. 提示ORA-28000 the account is locked

    1.启动项目的时候提示ORA-28000 the account is locked. 2. 这是因为用户被锁定了. 查询FAILED_LOGIN_ATTEMPTS参数默认值,这个参数限制了从第一次登 ...

  5. 使用pycharm开发web——django2.1.5(五)表单和通用视图

    看了刘江老师教程这么多天,卧槽,我才发现他也曾跻身于行伍之间,interesting 刘老师这波讲解很到位,告诉你如何编写单例视图的时候忽然告诉你,其实不用这么麻烦,我们有通用视图,那些总是要做相似的 ...

  6. Spring 加载项目外部配置文件

    背景 在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题: 即使是配置文件修改,也还需要整个项目重新打包和部署. 整个项目只有一套环境,不能切换. 针对上面的问题,可以使用 ...

  7. (八)springMvc 的参数绑定

    参数绑定 将客户端传来的 key/value 数据,绑定到 Controller 参数的过程 : 这一过程发生在调用 处理器适配器 的时候,spring 会去调用 参数绑定 组件,我使用的版本(4.5 ...

  8. codeforces 1249D1/D2 Too Many Segments (贪心)

    (点击此处查看原题) 题意说明 有n个区间,第i个区间覆盖范围[li,ri]内所有点,问删除最少哪些区间,使得所有点被区间覆盖的次数少于等于k次 解题思路 看到这个题的时候,觉得和开关(反转)问题很像 ...

  9. 小木棒HDU1455(DFS+剪枝)

    题意:HDU1455 给出n个小木棒的长度,他们是又数根长度相同的木棒剪短得来的,问没剪短之前的木棒长度最短是多少. 思路: 见代码:https://www.cnblogs.com/fqfzs/p/9 ...

  10. python学习-9 pycharm的安装

    1.python 开发IDE :  pycharm.eclipse等等 安装: 百度搜索pycharm 就可以了,去官网下载专业版.(百度有各种破解方法)                    #不要 ...