Garbage collection Java扫描器-垃圾收集

Garbage collection Java扫描器-垃圾收集,garbage-collection,java.util.scanner,Garbage Collection,Java.util.scanner,在此代码中是否需要关闭扫描仪 公共静态字符串输入最终字符串输出{ System.out.打印输出; java.util.Scanner sc=new java.util.ScannerSystem.in; 返回sc.nextLine; 核对 导入java.util.Scanner; 公共静态字符串输入最终字符串输出 { 字符串str=; System.out.打印输出; 扫描仪sc=新的扫描系统.in; whilesc.hastline{ str=sc.nextLine } retu

在此代码中是否需要关闭扫描仪

公共静态字符串输入最终字符串输出{ System.out.打印输出; java.util.Scanner sc=new java.util.ScannerSystem.in; 返回sc.nextLine; 核对

导入java.util.Scanner; 公共静态字符串输入最终字符串输出 { 字符串str=; System.out.打印输出; 扫描仪sc=新的扫描系统.in; whilesc.hastline{ str=sc.nextLine

}

    return str; 
}

不,你不需要关闭它。即使你的IDE说你需要也不需要

您不需要这样做的原因是您的代码不负责打开System.in。JVM在启动时就这样做了

一般原则是让打开资源的代码负责关闭它。在这种情况下,在调用input返回后,应用程序的其他部分仍然可以访问System.In。可能需要使用它,但如果在此处关闭它,则无法使用它。调用Scanner.close将尝试关闭它所在的任何源包装

但是,由于另一个原因,您的代码可能是错误的。如果要为System.in创建扫描程序,您应该在全局范围内执行此操作,而不是使用可以从许多地方调用的方法

为什么?

因为您只能在扫描仪中安全地包装一次给定的输入流对象

扫描仪控制流的生命周期。 扫描器可能会提前从缓冲区中读取流中任意数量的字符,从而使其他内容(例如另一个扫描器)无法使用这些字符。因此,两个试图从同一个流中读取的扫描器可能会意外丢失字符。
关闭扫描仪将关闭已包装的源代码,无论您是显式地还是通过“资源试用”来关闭。但是,扫描仪是不可终结的…这意味着GC不会仅仅因为无法访问扫描仪而尝试关闭已包装的源代码。

不确定您在这里想说什么…但我看不出它是如何回答操作的这是我的问题。