如果在代码中关闭了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应该如何关闭相关推荐

  1. java学习(13):scanner中的方法

    //Scanner类中的方法 //优点一: 可以获取键盘输入的字符串 //优点二: 有现成的获取int,float等类型数据,非常强大,也非常方便: public static void Scanne ...

  2. Java Scanner的hasNext()方法

    Java 关于Scanner的hasNext()方法的二三事 在编程笔试(或者某些场景)中,可能存在这样的需求:程序被要求接收不确定数量的一些字符串或者是数字,然后对接收的数据进行相关的处理. 假设这 ...

  3. Scanner的nextLine()方法读不到数据的小坑

    项目场景: 使用Scanner的nextLine()方法获取数据的时候出现了问题,一般发生在和next(),nextInt()等类似方法混用的时候 问题描述 例如:以下这段代码,本意应该是在控制台输入 ...

  4. Scanner调用next方法时报错NoSuchElementException原因,及对Scanner的一些总结

    对象new Scanner(System.in)调用close()后,如果又使用重新创建了对象,在调用next方法时报错NoSuchElementException jshell> Scanne ...

  5. scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...

    如何使用Scanner类从控制台读取输入? 像这样: System.out.println("Enter your username:"); Scanner = input(); ...

  6. 计算机最彻底的杀毒方法,手把手教你Win10创意者彻底关闭windows defender杀毒软件方法...

    虽然Windows10系统中自带了windows defender杀毒软件,但是不少用户对它的评价褒贬不一,令人讨厌的是有些文件,不经过任何提示就直接删除了.那么我们要如何关闭windows defe ...

  7. Java中Scanner的使用方法

    Scanner是SDK1.5新增的一个类,但是使用该类创建一个对象. Scanner reader=new Scanner(System.in);  然后reader对象调用下列方法(函数),读取用户 ...

  8. Java Scanner类的方法及用法(很详细)

    一.Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringTokenizer和Matcher类之间的某种结合.由于 ...

  9. Scanner的使用方法

    Scanner的使用 一.使用next()方法接收字符串,使用hasNext()方法判断是否有字符串的输入 import java.util.Scanner; //next()不能得到空白的字符串 p ...

  10. scanner java重新输入_如何使用Scanner Java重复读取用户输入

    我正在尝试为我的程序创建一个简单的菜单来读取用户输入.这是代码: public void menu() { String command; System.out.println("To op ...

最新文章

  1. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc
  2. Python调整图片大小并保存调整后的图像
  3. 【荐】说说CSS Hack 和向后兼容
  4. Android自动填充短信验证码
  5. Asp.net正则获取html内容
  6. C++获取字符串长度详解
  7. lottie 动画_使用After Effects和Lottie制作网络动画而不会损失质量
  8. 任务管理器杀不了的进程如何关闭
  9. 逆向分析 工具、加壳、安全防护篇
  10. JBX+WL8+Struts国际化中的一些问题
  11. 分享过几个【贪吃蛇】了,再分享一下也不过分吧?(妙趣横生)
  12. oracle登录 报ora00604,oracle 表空间不足 ORA-00604 ORA-01653 ORA-02002 ORA-00604 ORA-01653
  13. 【实例间对比】ICE: Inter-instance Contrastive Encoding for Unsupervised Person Re-identification论文笔记
  14. 集合有哪些 java_java集合有哪些
  15. 前端如何在H5页面调起微信支付
  16. ACdreM-1061 郭式树 没文化真可怕
  17. C语言怎么实现多个值输出?
  18. 教你如何进入google国际版 不跳转g.cn 及 opendns
  19. config.guess 更新
  20. matlab绘图实验报告心得,matlab实验报告心得.docx

热门文章

  1. 线性代数学习笔记(七)——克莱姆法则
  2. 精英阶层是怎么心甘情愿被收割的
  3. Python制作微信小助手
  4. SSRF漏洞修复方案
  5. 电脑无缘无故黑屏,无法调节亮度。
  6. 饿了么移动测试平台探索之路
  7. 计算机中的八卦知识,原来计算机的核心技术来自周易八卦
  8. android刷win8,驰为VX8 3G Win8刷安卓系统固件教程发布
  9. 基于R语言的Kaggle案例分析学习笔记(七)
  10. [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode 解决方法