Java 扫描程序 - 垃圾收集
Java Scanner - Garbage Collection
我需要关闭这段代码中的扫描仪吗?
public static String input(final String out){
System.out.print(out);
java.util.Scanner sc = new Java.util.Scanner(System.in);
return sc.nextLine();
检查
进口java.util.Scanner;
public 静态字符串输入(最终字符串输出)
{
字符串 str="";
System.out.print(出局);
扫描仪 sc = 新扫描仪 (System.in);
同时(sc.hasNextLine()){
str=sc.nextLine();
}
return str;
}
不,您不需要关闭它。 (即使您的 IDE 说您愿意!)
您不需要的原因是 您的代码 不负责打开 System.in
。 JVM 在启动时就这样做了。
一般原则是让打开资源的代码负责关闭资源。在这种情况下,在调用 input
returns 之后,应用程序的其他部分仍然可以访问 System.in
。可能需要用到,但是这里关闭了就不能用了。调用 Scanner.close()
将尝试关闭它正在包装的任何源。
但是,由于其他原因,您的代码(可能)是错误的。如果你要为 System.in
创建一个 Scanner
,你应该这样做 "globally",而不是在一些可以从很多地方调用的方法中。
为什么?
因为您只能将给定的输入流对象安全地包装在 Scanner
中一次。
Scanner
控制流的生命周期。
Scanner
可能从流中预读缓冲区任意数量的字符,使它们对其他东西不可用;例如另一个 Scanner
。因此,两个 Scanners
尝试从同一个流中读取可能会意外丢失字符。
关闭 Scanner
将关闭包装的源代码,无论您是明确地还是通过 try-with-resources 这样做。但是,Scanner
不可终结...这意味着 GC 不会仅仅因为 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();
检查
进口java.util.Scanner; public 静态字符串输入(最终字符串输出) { 字符串 str=""; System.out.print(出局); 扫描仪 sc = 新扫描仪 (System.in); 同时(sc.hasNextLine()){ str=sc.nextLine();
}
return str;
}
不,您不需要关闭它。 (即使您的 IDE 说您愿意!)
您不需要的原因是 您的代码 不负责打开 System.in
。 JVM 在启动时就这样做了。
一般原则是让打开资源的代码负责关闭资源。在这种情况下,在调用 input
returns 之后,应用程序的其他部分仍然可以访问 System.in
。可能需要用到,但是这里关闭了就不能用了。调用 Scanner.close()
将尝试关闭它正在包装的任何源。
但是,由于其他原因,您的代码(可能)是错误的。如果你要为 System.in
创建一个 Scanner
,你应该这样做 "globally",而不是在一些可以从很多地方调用的方法中。
为什么?
因为您只能将给定的输入流对象安全地包装在 Scanner
中一次。
Scanner
控制流的生命周期。Scanner
可能从流中预读缓冲区任意数量的字符,使它们对其他东西不可用;例如另一个Scanner
。因此,两个Scanners
尝试从同一个流中读取可能会意外丢失字符。
关闭 Scanner
将关闭包装的源代码,无论您是明确地还是通过 try-with-resources 这样做。但是,Scanner
不可终结...这意味着 GC 不会仅仅因为 Scanner
变得无法访问而尝试关闭包装的源。