有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么我要关闭java。util。扫描仪变量?

我在Eclipse中得到一个警告,代码如下:

代码:

Scanner money = new Scanner(System.in);
System.out.println(money.nextLine());
//money.close();

警告:

Description Resource    Path    Location    Type
Resource leak: 'money' is never closed  apples.java /SwordsNMoney/src   line 6  Java P

这个警告是什么?资源泄漏是什么意思

多谢各位


共 (5) 个答案

  1. # 1 楼答案

    Scanner打开底层操作系统的文件描述符(或文件通道或流),该描述符通常用非托管(通常为C语言)编写

    一个保持打开的流,有时可以一直保持打开状态,直到内核决定关闭它(比如,在程序完成执行之后……高度依赖于实现)

    因此,显式关闭资源是一个好主意

  2. # 2 楼答案

    泄漏通常定义为未收集垃圾。例如线程泄漏、对象泄漏——在这种情况下,线程占用内存,对象不会被垃圾收集

    在这里,您没有关闭货币参考变量。所以引用不会被释放。所以它被称为参考泄漏

  3. # 3 楼答案

    可能是,底层资源是一个文件描述符(在本例中是System.in),永远不会被释放,因此如果您没有正确关闭它,就会被阻止

    据我所知,Java有一些处理机制来自动关闭打开的扫描仪。有人知道更多吗

  4. # 4 楼答案

    资源泄漏通常是一种错误的资源消耗模式,程序不释放它获取的资源。这可能导致糟糕的服务

    垃圾收集只能管理内存,不能管理其他系统资源。如果Java程序有足够的可用内存,则不会自动触发垃圾收集

    所有操作系统对可打开的套接字、文件句柄等的数量都有限制。因此,对非内存资源的引用的无意维护可能导致资源泄漏。因此,管理非内存资源非常重要

    使用非内存资源的类应该提供显式分配/取消分配这些资源的方法。我们需要明确地调用close()方法来释放finally{}中的文件描述符,因为无论是否引发异常,它都将执行

  5. # 5 楼答案

    您需要在IO类上调用“close”

    可以使用try-catch和finally-block,在finally-block中可以关闭扫描仪

    docs

    Close

    If this scanner has not yet been closed then if its underlying readable also implements the Closeable interface then the readable's close method will be invoked. If this scanner is already closed then invoking this method will have no effect.