基本概念

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.inin于是一个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()方法所引发的错误及其解决方案相关推荐

  1. JAVA Scanner 类用法小结

    JAVA Scanner 类用法小结 1.Scanner是java中的一个类,可使用这个类创建一个对象,进行输入操作. Scanner reader = new Scanner(System.in): ...

  2. java scanner 教程,Java Scanner 类 - Java 入门教程

    一直以来,我们都使用 System.out.println() 方法向屏幕打印内容,那么如何接收输入的内容呢?本小节所学习的 Scanner 类就可以实现对输入内容的接收.在本小节,我们将学习 Sca ...

  3. Java Scanner类

    可以通过 Scanner 类来获取用户的输入. 创建一个Scanner的基本语法: Scanner s = new Scanner(System.in); Scanner 类的两种获取输入字符串方法的 ...

  4. Java Scanner 类

    Java Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 下面是创建 Scanner 对象的基本语法: Scann ...

  5. java scanner类 构造器,Java Scanner类

    本文概述 Java的Scanner类可在java.util包中找到. Java提供了多种从键盘读取输入的方法, java.util.Scanner类就是其中之一. Java Scanner类使用默认为 ...

  6. java scanner类成员_Java Scanner类的使用示例

    1 Scanner的使用 JDK给我们提供了成千上万个类供我们直接使用,而Scanner就是这众多类里的一个最常用的一个类,既然它是一个类,我们使用它的方法和使用我们自己写的类的方法基本一致. 方法基 ...

  7. Java Scanner类的详细介绍(Java键盘输入)

    Java Scanner类的详细介绍(Java键盘输入) 一.Scanner类的简单使用 二.Scanner类的详细介绍 1.判断输入数据类型 2.next()与nextLine()的区别 3.求多个 ...

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

    Java Scanner类的方法及用法(很详细) Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringToken ...

  9. jqweui组件,confirm嵌套prompt后调用一个方法中的alert无法关闭掉

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 解决方法 前言 jqweui组件,confirm嵌套prompt后调用一个方法中的alert无法关闭掉 提示:以下是本 ...

最新文章

  1. 离开当前屏幕的判断方法_掌中宝系列之EMG电动门调整方法
  2. 【转载】在Linux CentOS中安装VSCode用于C++学习,亲测可用
  3. 流式计算优化:时效性 [王方浩视角]
  4. Ubuntu 14.04.3 LTS 配置 DNS Server
  5. 连接hadoop java.io.IOException:Could not locate executable null\bin\winutils.exe in the Hadoop binarie
  6. 【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)
  7. 系统性能分析从入门到进阶
  8. JAVA 一个或多个空格分割字符串
  9. Cortex-M0(5)---Cortex-M0【中断向量表】【中断控制和系统控制
  10. zero copy图解
  11. Delphi 解压缩 ZipForge
  12. java取得当前日期增加一天或多天
  13. SOLID原则(转载)
  14. jquery 元素第二个_jQuery知识总结
  15. 韩立刚Linux基础入门,Linux入门基础笔记1(韩立刚课程)(示例代码)
  16. item_search - 按关键字搜索EBAY商品
  17. 劉筱娟:人工智能名片能在移动互联网营销上发挥什么作用?
  18. java gef_GEF简介
  19. 1、计算机图形学——基础变换矩阵
  20. 安焦的caoz和幻影的众人 过招

热门文章

  1. 企业远程接入配置 不宜贪小失大
  2. 丢失__EVENTTARGET _dopost Asp.net自带隐藏域和脚本的现象
  3. delphi cxgrid读取本地image_技术讨论 | PHP本地文件包含漏洞GetShell
  4. linux上查看gitlab日志,如何查看Gitlab的版本?
  5. d盘莫名其妙被占空间 win10_Win10不好用?你不可不知的Win10技巧
  6. java中的基本数据类型_java的基本数据类型有哪些
  7. c语言计算机二级考试内容,2017计算机二级考试内容C语言
  8. mysql单点故障_如何解决云服务商单点故障频发的问题?
  9. 点击延迟_解决移动端浏览器点击延迟300ms的问题——FastClick用法
  10. java interface 函数_java8函数式接口(Functional Interface)