JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案
基本概念
Java通过系统类System实现标准输入/输出的功能
通过实例化Scanner类的方式实现从键盘的数据输入
问题描述
错误示例一:
import java.util.Scanner;public class CloseTest {public static void main(String[] args){Scanner in = new Scanner(System.in);int a = in.nextInt();System.out.println(a);in.close();Scanner in_2 = new Scanner(System.in);int b = in_2.nextInt();System.out.println(b);in_2.close();}
}
输入1后的结果:1
Exception in thread "main" java.util.NoSuchElementExceptionat java.util.Scanner.throwFor(Scanner.java:862)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at test.CloseTest.main(CloseTest.java:13)
错误示例二:
错误示例三:
19行的注释去掉后运行时第22行就会报错
问题分析
以错误示例一为例:
在创建Scanner类对象in后,实现了输入,试图调用close方法关闭输入流,再创建一个新的Scanner对象,
在int b = in_2.nextInt();一句出现错误。
这是因为创建的in和in_2对象都是有System.in封装而来的,虽然是两个独立的对象,但是用的是同一个输入流
补充:System.in 而in于是一个final类型,它一旦被初始化就不能被改变。所以,不过你后面创建多少个Scanner类对象,其实都是返回同一个InputStream流。也就是说,每一次赋给新对象的地址是同一个。
在调用in.close()实际上相当于System.in.close()
对于创建的in_2来说,System.in已经被关闭了。
补充:Scanner类的close()方法会关闭其绑定的输入流。
即:一旦关闭 System.in 流时,后面的对象所用的 System.in 流就是关闭状态。而 System.in 一个final类型,无法获取一个新的 System.in 流
惊喜就会产生!若是不注意可能写了很多代码后才报错,这样就很难找到真正的错误点。
当然也可以通过反编译查看调用情况。
对于错误示例三:console对象绑定的输入流即 System.in ,但是 System.in 已经关闭,导致抛出异常。
解决方案
方法一:
在所有其他的类中不使用使用close()方法
然后在包含主函数的类中创建Scanner对象,在代码的最后调用close()
参考文章
https://www.cnblogs.com/caoshuiping/p/11286265.html
https://blog.csdn.net/qq_35029061/article/details/85525157
https://blog.csdn.net/daiidai/article/details/80716312
http://www.imooc.com/wenda/detail/569103
https://blog.csdn.net/biao_suki/article/details/45357425
JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案相关推荐
- JAVA Scanner 类用法小结
JAVA Scanner 类用法小结 1.Scanner是java中的一个类,可使用这个类创建一个对象,进行输入操作. Scanner reader = new Scanner(System.in): ...
- java scanner 教程,Java Scanner 类 - Java 入门教程
一直以来,我们都使用 System.out.println() 方法向屏幕打印内容,那么如何接收输入的内容呢?本小节所学习的 Scanner 类就可以实现对输入内容的接收.在本小节,我们将学习 Sca ...
- Java Scanner类
可以通过 Scanner 类来获取用户的输入. 创建一个Scanner的基本语法: Scanner s = new Scanner(System.in); Scanner 类的两种获取输入字符串方法的 ...
- Java Scanner 类
Java Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 下面是创建 Scanner 对象的基本语法: Scann ...
- java scanner类 构造器,Java Scanner类
本文概述 Java的Scanner类可在java.util包中找到. Java提供了多种从键盘读取输入的方法, java.util.Scanner类就是其中之一. Java Scanner类使用默认为 ...
- java scanner类成员_Java Scanner类的使用示例
1 Scanner的使用 JDK给我们提供了成千上万个类供我们直接使用,而Scanner就是这众多类里的一个最常用的一个类,既然它是一个类,我们使用它的方法和使用我们自己写的类的方法基本一致. 方法基 ...
- Java Scanner类的详细介绍(Java键盘输入)
Java Scanner类的详细介绍(Java键盘输入) 一.Scanner类的简单使用 二.Scanner类的详细介绍 1.判断输入数据类型 2.next()与nextLine()的区别 3.求多个 ...
- Java Scanner类的常用方法及用法(很详细)
Java Scanner类的方法及用法(很详细) Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringToken ...
- jqweui组件,confirm嵌套prompt后调用一个方法中的alert无法关闭掉
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 解决方法 前言 jqweui组件,confirm嵌套prompt后调用一个方法中的alert无法关闭掉 提示:以下是本 ...
最新文章
- 离开当前屏幕的判断方法_掌中宝系列之EMG电动门调整方法
- 【转载】在Linux CentOS中安装VSCode用于C++学习,亲测可用
- 流式计算优化:时效性 [王方浩视角]
- Ubuntu 14.04.3 LTS 配置 DNS Server
- 连接hadoop java.io.IOException:Could not locate executable null\bin\winutils.exe in the Hadoop binarie
- 【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)
- 系统性能分析从入门到进阶
- JAVA 一个或多个空格分割字符串
- Cortex-M0(5)---Cortex-M0【中断向量表】【中断控制和系统控制
- zero copy图解
- Delphi 解压缩 ZipForge
- java取得当前日期增加一天或多天
- SOLID原则(转载)
- jquery 元素第二个_jQuery知识总结
- 韩立刚Linux基础入门,Linux入门基础笔记1(韩立刚课程)(示例代码)
- item_search - 按关键字搜索EBAY商品
- 劉筱娟:人工智能名片能在移动互联网营销上发挥什么作用?
- java gef_GEF简介
- 1、计算机图形学——基础变换矩阵
- 安焦的caoz和幻影的众人 过招
热门文章
- 企业远程接入配置 不宜贪小失大
- 丢失__EVENTTARGET _dopost Asp.net自带隐藏域和脚本的现象
- delphi cxgrid读取本地image_技术讨论 | PHP本地文件包含漏洞GetShell
- linux上查看gitlab日志,如何查看Gitlab的版本?
- d盘莫名其妙被占空间 win10_Win10不好用?你不可不知的Win10技巧
- java中的基本数据类型_java的基本数据类型有哪些
- c语言计算机二级考试内容,2017计算机二级考试内容C语言
- mysql单点故障_如何解决云服务商单点故障频发的问题?
- 点击延迟_解决移动端浏览器点击延迟300ms的问题——FastClick用法
- java interface 函数_java8函数式接口(Functional Interface)