【问题标题】:Resource leak warning and line breakpoint in eclipseeclipse中的资源泄漏警告和断点
【发布时间】:2020-11-29 18:19:59
【问题描述】:

获取数组元素的简单程序。 我在第 5 行收到了两条消息

import java.util.*;

public class Hier {

    public static void main(String[] args)
    {
        Scanner inp=new Scanner(System.in);
        int[] arr=new int[4];
        int i;
        
        for(i=0;i<arr.length;i++)
        {
            arr[i]=inp.nextInt();
        }
        
        System.out.println("Elements: ");
        
        for(i=0;i<arr.length;i++)
        {
            System.out.println(arr[i]);
        }
    }
}

【问题讨论】:

  • 您应该更准确地了解行号。我们对它是哪一个感到困惑。

标签: java arrays eclipse


【解决方案1】:

通常你需要关闭Scanner——除非它包裹System.in,因为你不应该关闭标准输入。 Eclipse 不够聪明,无法知道其中的区别,这就是它向您发出警告的原因。您可以放心地忽略警告,也可以使用 SuppressWarnings 注释。

import java.util.*;

public class Hier {

    public static void main(String[] args)
    {
        @SuppressWarnings("inp")
        Scanner inp=new Scanner(System.in);
        int[] arr=new int[4];
        int i;
        
        for(i=0;i<arr.length;i++)
        {
            arr[i]=inp.nextInt();
        }
        
        System.out.println("Elements: ");
        
        for(i=0;i<arr.length;i++)
        {
            System.out.println(arr[i]);
        }
    }
}

【讨论】:

  • System.in可以通过System.setIn​(...)更改,所以不能保证System.in不需要关闭。
【解决方案2】:

您基本上需要在使用完扫描仪后关闭它。

    public static void main(String[] args)
    {
        Scanner inp = new Scanner(System.in);
        try
        {
            int[] arr = new int[4];
            int i;

            for (i = 0; i < arr.length; i++)
            {
                arr[i] = inp.nextInt();
            }

            System.out.println("Elements: ");

            for (i = 0; i < arr.length; i++)
            {
                System.out.println(arr[i]);
            }
        } finally
        {
            inp.close();
        }
    }

或者,如果使用 Java 7+,您可以像这样使用 try-with-resources:

try (Scanner inp = new Scanner(System.in)) 
{
//your code
}

【讨论】:

  • Eclipse 在这里是错误的,因此这是一个不好的建议。真正需要关闭的是实际资源。 Scanner,就像 BufferedInputStream 和 co 一样是过滤器流——它们包装了一个实际的资源。它们本身并不是需要关闭的东西。关闭它们通常很聪明:它们可以缓冲,并且关闭有一个内置的刷新(并且也会关闭它们包装的东西)。这里的关键线索是它包装的东西 (System.in) 不是由这段代码创建的,因此也应该 not 被这段代码关闭。 Eclipse 不应该警告过滤器流。
  • 考虑到这个背景:你不想关闭 System.in (有一些奇怪的情况你会这样做,但在大多数情况下这绝对不是合适的事情,这个问题就是关于一般建议,而不是特定情况)。关闭扫描仪将关闭 System.in。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2012-12-07
  • 2016-07-24
  • 2012-10-23
  • 2019-06-20
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多