2013-08-01 61 views
8

很多时候,我遇到了这样的声明,即应用程序应始终明确地关闭它打开的所有资源。关闭资源总是很重要吗?

我的编程方法比较实用,我不喜欢盲目地遵循任何我没有明确看到的好处。因此我的问题。

让我们假设:

  1. 我有一个小的应用程序
  2. 它开辟一些资源(例如文件,数据库连接,远程流),并对其进行处理
  3. 它的工作几分钟,然后它退出
  4. 比方说,这是一个Java(如果语言是相关的)

难道我真的关心CL收取我打开的所有资源?我想所有打开的资源都将在应用程序/虚拟机退出时关闭/释放。我对吗?

如果这是真的,是否有任何令人信服的理由关心在如此短小的工作应用程序中关闭资源?

UPDATE:

问题纯属假设,但对于不关心有关的说法是,我可能只是黑客一起一些快速的脚本,不想写任何不必要的代码没有直接关系到手边的问题:关闭资源,做所有这些详尽的try-catch-finally的东西,处理我不在乎的异常等。

问题的关键在于是否有任何实际后果不这样做。

+5

让我回答一个问题给你:你为什么不**关心关闭资源? –

+1

“猜测当应用程序/虚拟机退出时,我打开的所有资源都将被关闭/释放。” - >我的猜测是这不是真的。如果您不关闭并且VM退出,则操作系统可能负责关闭这些流/套接字。 – kosa

+3

为了摆脱警告,你必须禁止它们,它和.close()一样多。这也是很好的形式。 –

回答

9

我想所有打开的资源将在应用程序/虚拟机退出时关闭/释放。

如果资源未经过regurarly发布,会发生什么情况,您无法控制。它可能没有伤害,或者它可能会做一些。它也是高度依赖于平台的,所以只有一个测试不会有帮助。

为什么我应该关心在如此短小的工作应用程序中关闭这些资源?

应用程序的大小应该没有关系。首先,应用程序通常增长;其次,如果你没有以正确的方式练习,那么在重要时你就不会知道如何去做。

+1

资源闭合需要大量的练习,因为它是[真正棘手](http://illegalargumentexception.blogspot.de/2008/10/java-how-not-to-make-mess-of-stream.html) – zapl

+0

@ zapl感谢您的好链接! –

2

简答 - 是的。首先,这是严酷的编码习惯,就像在生活中的其他任何领域一样,不要自行清理。另一方面,你无法预测操作系统是否会认识到java环境不再需要这些资源,并且最终可能锁定文件/ etc,这些文件/ etc不能在没有强制重启的情况下发布。

总是要清理你打开的任何资源!

有关更新到原始问题的更新 - 添加try/catch块以关闭任何打开的资源需要5秒钟,并且可以防止您必须花5分钟重新启动计算机。这样做总是可以节省时间。我的父亲总是告诉我,真正的懒惰人第一次做正确的事情,所以他们不必再回来再做。我只是说不要懒惰,做正确的事。写入catch块需要5秒钟的时间永远不会显着减慢写入过程......不写入5秒可以大大减缓调试速度。

+1

“就像它在生活中的其他任何领域都不能自己清理一样”,说得好! –

+2

谢谢,你提出了一些好的观点。我真的不那么懒。我在我的代码中关闭了资源。只是我不喜欢公理和做事,“因为每个人都这样做”。这就是我故意制定这样一个有争议的问题的原因。这不仅仅是你提到的5秒,我不喜欢Java中需要的冗长但相当难看的代码。我们肯定需要切换到引入试用资源的Java7。 –

+0

我还没有玩过Java 7中新的“尝试使用资源”功能,但我同意你的看法:) – StormeHawke

5

如果您不关闭资源,这可能会导致应用服务器频繁重新启动时occurs.because操作系统资源枯竭和服务器 应用程序通常有资源

的上限限制根据docs

典型的Java应用程序操纵多种类型的资源,如 文件,流,套接字和数据库连接。这些资源必须非常小心地处理,因为它们获取系统资源eir operations.Thus,因此,你需要确保他们即使在出现错误时也能被释放。

事实上,不正确的资源管理是失败的 生产应用程序的常见来源,与通常的缺陷是数据库连接 和文件描述符发生异常后 别的某处其余开业代码。这导致应用程序服务器频繁地在发生资源耗尽时重新启动,因为操作系统和服务器通常对资源具有上限限制。

try-with-resources声明在Java 7中引入了谁不喜欢接近语句的程序员。

+1

+1关于'try-with-resources'的好建议。被困在Java 5的黑暗时代,我不知道它的存在。 – splungebob