初始化扫描器时出现错误:键入分号后,代码将变为斜体和蓝色。
错误消息显示:
Resource leak: 'in' is never closed.
如何避免此错误?
我的代码如下:
import java.util.Scanner;
public class Zoezi9 {
public static void main(String[] args) {
double cm;
int feet, inches, remainder;
final double CM_PER_INCH = 2.54;
final int IN_PER_FOOT = 12;
Scanner in = new Scanner(System.in);
System.out.print("How many cm?; ");
cm = in.nextDouble();
inches = (int) (cm/CM_PER_INCH);
feet = inches/IN_PER_FOOT;
remainder = inches % IN_PER_FOOT;
System.out.printf("%.2f cm = %d ft, %d in\n",cm,feet,remainder);
}
}
答案 0 :(得分:1)
某些资源需要特殊处理,以错误的方式使用它们时,您会冒资源泄漏的风险。
例如:当您打开文件时,底层操作系统为JVM提供文件句柄。当您在使用代码完成操作后忘记正确地“返回”该文件句柄时,...发生一次就不成问题。但是,假设您的应用程序可以持续运行数小时,数天,数周。然后这些事情加起来。最坏的情况是,在某个时候,您用尽了该资源的 out ,然后JVM崩溃了。
System.in
是一个InputStream,而InputStreams可以是此类资源。现在,您的编辑器将尝试为您提供帮助:它会注意到您使用了 some InputStream,但是,您从来没有对其调用 close 。
对于您而言,可以忽略该消息。在“现实世界”中,通常使用try-with-resource构造来避免此类陷阱。使用完该资源后,您就可以关闭它。
然后继续安迪·特纳(Andy Turner)的评论:您不会盲目地关闭任何可以关闭的东西。通常,组件管理自己创建的那些资源。 System.in
不属于您的课程,也不属于您的课程。因此,从概念上讲,让您的班级关闭它错误。
除此之外,“警告”的确切内容取决于您的编辑器/ IDE和您所设置的设置。因此,您可以在那里简单地禁用此警告。根据收到的警告类型,还有@SuppressWarnings。而且更合适:@WillNotClose!
答案 1 :(得分:1)
Scanner
实现了接口Closable
,该接口扩展了AutoClosable
。这是一种告诉Java的新颖而便捷的方法,即应该在某个特定位置关闭扫描器-开启后无论发生什么情况。
就您而言,您不应使用此功能。关闭System.in
将阻止您稍后再次使用它。
但是,使用其他输入源时,将是必需/推荐的。
如果要使用它,可以使用以下语法:
try (Scanner in = new Scanner(<some other input source that requires closing>)) { // open Scanner
// use Scanner
} // close Scanner, even if an exception was risen in the meanwhile