当前位置: 首页 > 知识库问答 >
问题:

当使用显式构造函数调用时,如何避免“潜在的资源泄漏”警告?

蓟安歌
2023-03-14

在我以前的代码中,为了方便起见,我经常使用以下构造函数习语:

MyClass( InputStream input ) {
  // do actual stuff
}
MyClass( String filename ) {
  this( new FileInputStream(filename) )
}

通常,我会对可自动关闭的FileInputStream使用try-with块,但这在这里是不可能的,因为调用必须始终是构造函数中的第一条语句。也就是说,以下内容不编译:

MyClass( InputStream input ) {
  // do actual stuff
}
MyClass( String filename ) {
  try( FileInputStream fis = new FileInputStream(filename) ) {
    this( fis );
  }
}

那么,什么才是正确的(也是优雅的?)如何使用这个习语而不冒潜在资源泄漏的风险?任何帮助都很感激。

共有1个答案

盖高畅
2023-03-14

即使您可以将构造函数调用包装在try-with-resources中,这真的有意义吗?构造函数很可能将inputstream存储在某种内部状态,因此在构造函数中关闭它将使它在随后用于该类的其他方法时无效。

更好的解决方案是使MyClass实现AutoCloseable并在close()方法中关闭输入流,从而使类的用户能够控制如何关闭传递给MyClass实例的输入流。

 类似资料:
  • eclipse“潜在资源泄漏”警告不正确。 没有警告: 警告:潜在资源泄漏:“此位置可能未关闭响应” 为什么第二种方法会引起警告? 谢谢!

  • 我有一个连接到MySQL的服务方法,可以在中获取数据,最后在

  • 问题内容: 我有一个客户端库,在该客户端库中对我的REST服务进行http远程调用,然后返回给客户,该客户正在调用我的库,其中包含从REST服务获得的响应以及所有错误(如果包装了任何错误)围绕对象。 这是我的枚举类: 这是我的枚举类: 如您所见,在我的课堂上我有很多领域,因此我有一个很长的构造器,每次当我做一个对象的时候都会有很大的联系。将来我可能会有更多的字段,但目前只有这些字段。 有什么更好的

  • 在中,我收到了一个警告,我不明白这一点。 这是理解问题还是java/eclipse问题?

  • 问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文

  • 我正在看一些Java教程,对使用扫描器时的资源泄露警告感到疑惑。 我知道我可以关闭它,但视频中的人没有得到警告,即使他使用的是完全相同的代码,为什么呢?