Skip to main content
 首页 » 编程设计

java中为什么我在 "new Scanner(System.in);"上收到错误

2025年12月25日48webabcd

初始化扫描仪时出现错误:只要输入分号,代码就会变成斜体和蓝色。

错误消息显示:

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可以是这样的资源。现在,您的编辑器尝试帮助您:它注意到您使用了some InputStream,但是,嘿,您从未对其调用close

就您而言,忽略该消息是安全的。在“现实世界”中,您通常可以使用 try-with-resource 来避免此类陷阱。构造。在您使用完已使用的资源后,该资源会负责关闭该资源。

跟进 Andy Turner 的评论:您不能盲目地关闭任何可以关闭的东西。通常,组件管理它自己创建的那些资源。 System.in 不属于您的类(class),也不是您的类(class)打开的。因此,从概念上讲,让您的类(class)关闭它是错误

除此之外,具体的“警告”取决于您的编辑器/IDE 以及您所做的设置。因此,您可以简单地禁用此警告。根据您收到的警告类型,还有 @SuppressWarnings 。甚至更合适:@WillNotClose !