Java “为什么我会在”上出错;新扫描仪(System.in)&引用;?

Java “为什么我会在”上出错;新扫描仪(System.in)&引用;?,java,java.util.scanner,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;

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

错误消息显示:

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

    }
}
某些资源需要特殊处理,如果使用方法不当,可能会导致资源泄漏

例如:当您打开一个文件时,底层操作系统向JVM提供一个文件句柄。当您忘记在代码使用完毕后正确地“返回”该文件句柄时。。。只要发生一次,这不是问题。但假设您的应用程序持续运行数小时、数天或数周。然后这些事情就加起来了。最糟糕的情况是,在某个时刻,您耗尽了该资源,然后JVM崩溃

System.in
是一个InputStream,InputStreams可以是这样的资源。现在,您的编辑器试图帮助您:它注意到您使用了一些InputStream,但嘿,您从未对其调用close

在您的情况下,忽略该消息是安全的。在“现实世界”中,您通常通过使用构造来避免此类陷阱。在您使用完已使用的资源后,它负责关闭该资源

接下来是安迪·特纳的评论:你不能盲目地关闭任何可以关闭的东西。通常,组件管理它自己创建的那些资源
System.in
不属于您的类,也不属于您的类。因此,从概念上讲,让类关闭它是错误的

除此之外,什么东西会被“警告”还取决于编辑器/IDE和设置。因此,您可以在那里简单地禁用此警告。根据您收到的警告类型,还有。而且更合适:

实现接口,该接口扩展了。这是一种新的、方便的告诉java的方式,即扫描程序应该在某个点关闭——无论打开后发生什么

在您的情况下,不应使用此功能。在中关闭
系统将阻止您以后再次使用它

但是,当使用其他输入源时,需要/建议使用

如果要使用它,可以使用以下语法:

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
try(Scanner in=new Scanner()){//打开Scanner
//使用扫描仪
}//关闭扫描程序,即使同时出现异常

没有问题,只需忽略它,因为
Scanner in=new Scanner(System.in)-其他扫描器应该关闭使用扫描器后,您可以键入.close(),这应该可以读取资源泄漏。@ScaryWombat您复制了一个错误问题的url。。我猜是疏忽。@taslim,人们常说你不应该关闭
系统。在
中,因为你不能重新打开它。请参阅,但您不应该关闭
系统中的
,或者实际上关闭任何您不拥有的流(通常表示“您没有创建”)。简单地说“所有扫描器都必须关闭”的检查过度简化了它:您不需要关闭使用字符串创建的扫描器,也不应该关闭使用已存在的流构造的扫描器。只是为了记录,有一些注释,如javax.annotation.WillNotClose和javax.annotation.WillClose,它们使您的意图对IDE(或其他静态分析工具)明确。它们只是提示,但可以防止此类警告。@AndyTurner很好的观察。相应地更新了答案。@rkosegi One从不停止学习;我不知道这个注释。添加了一个链接到我的答案-谢谢!实际上,在这种情况下关闭扫描器可能是有害的,因为它还将“关闭底层可读文件”(doc)——在这种情况下,即
System.in
,因此您将无法再从stdin读取。