【问题标题】:Resource leak warning in eclipse when extending ByteArrayOutputStream扩展 ByteArrayOutputStream 时 Eclipse 中的资源泄漏警告
【发布时间】:2015-12-09 09:19:31
【问题描述】:

我使用ByteArrayOutputStream 来填充具有不同字节长度的不同值的字节数组。我使用方法write(byte[] b)。由于此方法继承自 OutputStream,因此它可能会抛出 IOException。在ByteArrayOutputStream 中有一个方法write(byte[] b, int off, int len) 不会抛出IOException,所以我扩展ByteArrayOutputStream 并覆盖write(byte[] b) 方法,它现在也不会抛出IOException:

  private class ByteArrayOutputStreamNoException extends ByteArrayOutputStream
  {

      public ByteArrayOutputStreamNoException(int size)
      {
          super(size);
      }

      public ByteArrayOutputStreamNoException()
      {
          super();
      }

      @Override
      public void write(byte[] data)
      {
          write(data, 0, data.length);
      }
  }

使用扩展类,我现在在 Eclipse 4.5.1 中收到资源泄漏警告,因为我没有关闭代码中的流。 ByteArrayOutputStream 的情况并非如此。我的扩展类有什么问题,或者我必须添加什么来删除警告?我知道我可以将 SuppressWarnings 注释添加到流的每个实例化,但我更喜欢以某种方式更改扩展类以删除警告。

【问题讨论】:

  • 这是哪个版本的java?我复制了它,它没有显示 jdk 1.8 的任何警告
  • 我也使用 jdk 1.8.0_66。那么它可能是日食?

标签: java eclipse memory-leaks


【解决方案1】:

Eclipse 在标准 Java 库中有一个已知不需要资源泄漏警告的类列表,ByteArrayOutputStream 就是其中之一。在 Eclipse 错误358903 中有一个很长的描述。

实现这个的代码是org.eclipse.jdt.internal.compiler.lookup.ReferenceBindingapplyCloseableClassWhitelists 方法。类列表是硬编码的,不能扩展。

当您扩展 ByteArrayOutputStream 类时,Eclipse 无法再确定不需要 close,因此您会收到警告。

您可以使用“try-with-resources”样式的 try 语句来解决此问题:

try
 (ByteArrayOutputStreamNoException stream = new ByteArrayOutputStreamNoException())
 {
   // TODO work with the stream
 } 

【讨论】:

  • 好的,不知道这些类在eclipse中是硬编码的,谢谢。在这种情况下,我可能会使用@SuppressWarnings 注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2012-12-07
  • 2016-07-24
  • 2012-10-23
  • 2021-03-14
  • 2019-06-20
相关资源
最近更新 更多