Java Scanner与垃圾回收:此代码中是否需要关闭Scanner?
Java Scanner是否需要关闭?
咱们先聚焦到你给出的这段代码:
public static String input(final String out){ System.out.print(out); java.util.Scanner sc = new java.util.Scanner(System.in); return sc.nextLine(); }
针对这段代码里的Scanner,结论是:完全不需要手动调用sc.close(),甚至绝对不能这么做,原因主要有这几点:
- 首先,Scanner的
close()方法会连带关闭它底层依赖的输入流。这里Scanner绑定的是System.in(标准输入流),一旦关闭System.in,整个程序后续所有尝试从控制台读取输入的操作都会直接抛出IOException,彻底废掉标准输入通道——这显然不是你想要的结果。 - 其次,从垃圾回收的角度看:当这个方法执行完毕后,局部变量
sc会失去引用,后续垃圾回收器会自动处理这个Scanner对象。而System.in是由JVM负责管理的系统级资源,程序结束时JVM会自动关闭它,根本不需要我们手动干预,也不会造成资源泄漏。
当然,这里要补充一个例外情况:如果你的Scanner是绑定到自定义输入流(比如FileInputStream、网络流这类用户创建的流),那必须手动调用close(),或者用try-with-resources语法自动关闭,否则会导致文件句柄、网络连接这类资源泄漏,影响程序性能甚至稳定性。
内容的提问来源于stack exchange,提问作者Focus Android
相关产品推荐
相关产品推荐

