为什么在“ new Scanner(System.in);”上出现错误?

时间:2018-10-12 06:27:22

标签: java java.util.scanner

初始化扫描器时出现错误:键入分号后,代码将变为斜体和蓝色。

错误消息显示:

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);

    }
}

2 个答案:

答案 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