在我以前的代码中,为了方便起见,我经常使用以下构造函数习语:
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 );
}
}
那么,什么才是正确的(也是优雅的?)如何使用这个习语而不冒潜在资源泄漏的风险?任何帮助都很感激。
即使您可以将构造函数调用包装在try-with-resources
中,这真的有意义吗?构造函数很可能将inputstream
存储在某种内部状态,因此在构造函数中关闭它将使它在随后用于该类的其他方法时无效。
更好的解决方案是使MyClass
实现AutoCloseable
并在close()
方法中关闭输入流,从而使类的用户能够控制如何关闭传递给MyClass
实例的输入流。
eclipse“潜在资源泄漏”警告不正确。 没有警告: 警告:潜在资源泄漏:“此位置可能未关闭响应” 为什么第二种方法会引起警告? 谢谢!
我有一个连接到MySQL的服务方法,可以在中获取数据,最后在
问题内容: 我有一个客户端库,在该客户端库中对我的REST服务进行http远程调用,然后返回给客户,该客户正在调用我的库,其中包含从REST服务获得的响应以及所有错误(如果包装了任何错误)围绕对象。 这是我的枚举类: 这是我的枚举类: 如您所见,在我的课堂上我有很多领域,因此我有一个很长的构造器,每次当我做一个对象的时候都会有很大的联系。将来我可能会有更多的字段,但目前只有这些字段。 有什么更好的
在中,我收到了一个警告,我不明白这一点。 这是理解问题还是java/eclipse问题?
问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文
我正在看一些Java教程,对使用扫描器时的资源泄露警告感到疑惑。 我知道我可以关闭它,但视频中的人没有得到警告,即使他使用的是完全相同的代码,为什么呢?