Scanner的close()方法的使用以及Scanner应该如何关闭
如果在代码中关闭了Scanner,也就是调用了Scanner.close()这个方法,那么在接下来的代码中将无法再使用Scanner,即便再次声明了一个新的Scanner对象也是如此。
Scanner sc = new Scanner(System.in);//创建第一个Scanner对象
sc.close()//将其关闭
//int i = sc.nextInt(); 对于该行代码无法使用应该没有争议,因为sc已经被关闭了
sc = new Scanner(System.in);//重新创建一个Scanner对象赋值给sc
//也可以选择重新建立一个变量
int i = sc.nextInt();
以上代码运行后会抛出异常java.util.NoSuchElementException;
这个异常的具体来源及原因可以从以下文章中了解,在此不重复赘述。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:scanner.close()的需要注意
但本文的撰写目的是为了解答应该在什么时候调用Scanner的close()方法,而非单纯的解析抛出异常的原因。
首先Scanner的close()方法会关闭System.in,也就是Scanner对象在被初始化时所传入的参数。
System.in是一个final常量,所以在整个方法中只会被实例化一次。
这也就导致了在第二次创建Scanner对象的时候并没有一个全新的System.in被传入,而是一个已经被关闭了的System.in。
那么是否能够重新打开System.in呢?
就目前查到的资料中表示System.in在被关闭后并不能重新打开,对于具体原因还不清楚。
所以如果要关闭Scanner的话一定要确保在同一方法下接下来不会再调用Scanner来接受输入。
接下来是为什么要关闭Scanner。
我们之所以要关闭Scanner是因为System.in在被第一次声明时会打开InputStream,而输入流是非常占据内存的,为此我们通常为了节省内存考虑会选择调用Scanner.close()来关闭输入流,从而节省内存。
如果一个方法中创建了Scanner对象,却没有关闭,那么在方法结束后,Scanner对象虽然会进入被回收的队列中,但不是立刻回收。而这会给计算机带来一定的负担,为了避免造成大量的内存占据,至少在方法结束前应该调用Scanner的close()方法。
例如:
public int run(){Scanner sc = new Scanner(System.in);//创建Scanner对象int i = sc.nextInt();//代码块(其中再次调用了sc)sc.close()//关闭Scanner,也就是关闭输入流//如果不写sc.close()的话尽管sc同样会在一段时间后被回收,但如果run函数被大量重复调用的话,就会导致一定程度的内存浪费return i;
}
需要注意的是,如果函数中有多个地方可能会结束方法,那么要在每次结束前确保Scanner对象被close了。
但如果能够保证接下来的部分不会在运用到Scanner,也可以提早进行Scanner的close()方法的调用。
这也就是为什么Scanner的close()不是总被放在最后的原因。
同时Scanner在方法中也占据了一定的内存,会影响到运行,能够及早释放也会更好。
例如:
public int run(){Scanner sc = new Scanner(System.in);//创建Scanner对象int i = sc.nextInt();sc.close()//关闭Scanner//代码块(其中没有调用sc)return i;
}
这样可以进一步节省内存,也保证了不用担心后面会出现突然结束方法而没有关闭Scanner的情况。
ps:虽然这样就要注意是否要再次调用Scanner了。
Scanner的close()方法的使用以及Scanner应该如何关闭相关推荐
- java学习(13):scanner中的方法
//Scanner类中的方法 //优点一: 可以获取键盘输入的字符串 //优点二: 有现成的获取int,float等类型数据,非常强大,也非常方便: public static void Scanne ...
- Java Scanner的hasNext()方法
Java 关于Scanner的hasNext()方法的二三事 在编程笔试(或者某些场景)中,可能存在这样的需求:程序被要求接收不确定数量的一些字符串或者是数字,然后对接收的数据进行相关的处理. 假设这 ...
- Scanner的nextLine()方法读不到数据的小坑
项目场景: 使用Scanner的nextLine()方法获取数据的时候出现了问题,一般发生在和next(),nextInt()等类似方法混用的时候 问题描述 例如:以下这段代码,本意应该是在控制台输入 ...
- Scanner调用next方法时报错NoSuchElementException原因,及对Scanner的一些总结
对象new Scanner(System.in)调用close()后,如果又使用重新创建了对象,在调用next方法时报错NoSuchElementException jshell> Scanne ...
- scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...
如何使用Scanner类从控制台读取输入? 像这样: System.out.println("Enter your username:"); Scanner = input(); ...
- 计算机最彻底的杀毒方法,手把手教你Win10创意者彻底关闭windows defender杀毒软件方法...
虽然Windows10系统中自带了windows defender杀毒软件,但是不少用户对它的评价褒贬不一,令人讨厌的是有些文件,不经过任何提示就直接删除了.那么我们要如何关闭windows defe ...
- Java中Scanner的使用方法
Scanner是SDK1.5新增的一个类,但是使用该类创建一个对象. Scanner reader=new Scanner(System.in); 然后reader对象调用下列方法(函数),读取用户 ...
- Java Scanner类的方法及用法(很详细)
一.Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringTokenizer和Matcher类之间的某种结合.由于 ...
- Scanner的使用方法
Scanner的使用 一.使用next()方法接收字符串,使用hasNext()方法判断是否有字符串的输入 import java.util.Scanner; //next()不能得到空白的字符串 p ...
- scanner java重新输入_如何使用Scanner Java重复读取用户输入
我正在尝试为我的程序创建一个简单的菜单来读取用户输入.这是代码: public void menu() { String command; System.out.println("To op ...
最新文章
- 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc
- Python调整图片大小并保存调整后的图像
- 【荐】说说CSS Hack 和向后兼容
- Android自动填充短信验证码
- Asp.net正则获取html内容
- C++获取字符串长度详解
- lottie 动画_使用After Effects和Lottie制作网络动画而不会损失质量
- 任务管理器杀不了的进程如何关闭
- 逆向分析 工具、加壳、安全防护篇
- JBX+WL8+Struts国际化中的一些问题
- 分享过几个【贪吃蛇】了,再分享一下也不过分吧?(妙趣横生)
- oracle登录 报ora00604,oracle 表空间不足 ORA-00604 ORA-01653 ORA-02002 ORA-00604 ORA-01653
- 【实例间对比】ICE: Inter-instance Contrastive Encoding for Unsupervised Person Re-identification论文笔记
- 集合有哪些 java_java集合有哪些
- 前端如何在H5页面调起微信支付
- ACdreM-1061 郭式树 没文化真可怕
- C语言怎么实现多个值输出?
- 教你如何进入google国际版 不跳转g.cn 及 opendns
- config.guess 更新
- matlab绘图实验报告心得,matlab实验报告心得.docx
热门文章
- 线性代数学习笔记(七)——克莱姆法则
- 精英阶层是怎么心甘情愿被收割的
- Python制作微信小助手
- SSRF漏洞修复方案
- 电脑无缘无故黑屏,无法调节亮度。
- 饿了么移动测试平台探索之路
- 计算机中的八卦知识,原来计算机的核心技术来自周易八卦
- android刷win8,驰为VX8 3G Win8刷安卓系统固件教程发布
- 基于R语言的Kaggle案例分析学习笔记(七)
- [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode 解决方法