Scanner.close()关闭输流后无法使用其他Scanner对象的问题

问题描述

    实验过程中在使用Scanner对象来进行命令行输入的过程中,关闭输入流时会抛出如下的异常

Exception in thread "main" java.util.NoSuchElementException: No line found
	at java.util.Scanner.nextLine(Scanner.java:1540)
	at monkeycrossriver.ScannerTest.main(ScannerTest.java:13)

不关闭输入流这个问题就消失了(曾经都是这么解决过来的)。后来了解到如果像这种输入流不关闭的话,会占用内存,所以查询了一些东西来解决这个问题。

问题解决

    首先重现问题,最开始我以为是Scanner对象不能同时使用两次,但是执行了相关代码发现并不是这个原因引起的。后来发现程序中是有定义多个Scanner对象,而且错误的发生就在上一次Scanner关闭之后下一个Scanner开始读取命令行的输入过程中抛出的异常。意识到可能是因为关闭了一个Scanner影响了另一个Scanner的行为,所以执行了以下代码

public static void main(String[] args) {
    Scanner input1 = new Scanner(System.in);
    int a = Integer.parseInt(input1.nextLine());
    input1.close();
    System.out.println(a);
    
    Scanner input2 = new Scanner(System.in);
    String c = input2.nextLine();
    System.out.println(c);
    input2.close();
  }

    发现果然抛出的相关的异常,查询相关资料,发现System.in是“标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。 如果执行了close()方法,相当于是关闭了标准输入流,所以会影响到所有的标准输入流。

思考反思

    所以说,Scanner(System.in)的对象存在多个是无意义的,而且作为标准输入流也无需去区分不同的场合用什么不同的Scanner,所以完全可以将Scanner对象定义为全局的对象,并实现相关的方法在不再需要它的地方执行close()方法。
public class ScannerTest {
  private static final Scanner in = new Scanner(System.in);
  
  public static void main(String[] args) {
    int a = Integer.parseInt(in.nextLine());
    System.out.println(a);
    
    String c = in.nextLine();
    System.out.println(c);
    
    in.close();
  }
}



  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值