2013-08-01 19 views
8

何度も、アプリケーションは、開いたすべてのリソースを明示的に明示的に閉じる必要があるという声明を受けました。リソースを常に閉じることは重要ですか?

私のプログラミング手法はむしろ実用的で、私は盲目的に私が恩恵をはっきりと見ていない慣習に従うことを好まない。したがって、私の質問です。

のはそれを想定してみましょう:

  1. が、私はそれはいくつかのリソース(例えばファイル、データベース接続、リモートストリーム)を開き、それを処理
  2. 小さなアプリケーションを持っていることが、その後数分の作品
  3. それは(言語は関連性がある場合)

のは、それはJavaでだとしましょう出て、私は本当にCLを気にする必要がありますか私が開いたすべてのリソースを調べていますか?アプリケーション/仮想マシンが終了すると、開いたリソースはすべて閉じられ、解放されると思います。私は正しい?

これが本当であれば、そのような小さくて短い作業アプリケーションでリソースを閉じることに気を配る確かな理由はありますか?

UPDATE:

質問は純粋に架空のですが、はそれについてを世話ないための引数は、私は一緒にいくつかの簡単なスクリプトをハッキングすることができると直接関連しない不要なコードを書きたくないということです私が気にしていない例外を処理するなど、この冗長なtry-catch-finallyの処理をすべて実行します。

実際にはの結果があるかどうかです。それをしない。

+5

私はあなたに質問して答えさせてください:あなたはなぜリソースを閉じないよう気にしないのですか? –

+1

"アプリケーション/仮想マシンが終了すると、開いたリソースはすべて閉じられ、解放されます。" - >私の推測ではこれは真実ではありません。 VMを閉じずにVMが終了すると、OSがストリーム/ソケットを閉じる責任を負うことがあります。 – kosa

+3

警告を取り除くには、それらを抑制する必要があります。これは、.close()と同じくらい効果的です。また、それは良い形です。 –

答えて

9

オープンしたすべてのリソースは、アプリケーション/仮想マシンが終了すると閉じられたり解放されたりすると思います。

regurarly releaseされていないリソースは、制御できません。それは害を及ぼさないかもしれないし、何かをするかもしれない。プラットフォーム依存性も高いため、1つだけでテストすることは役に立ちません。

これらのリソースを小さく短く動作するアプリケーションで閉じてもよいのはなぜですか。

アプリケーションのサイズは重要ではありません。まず、アプリケーションは通常成長します。第二に、正しい方法で練習しないと、それが重要なときにそれをどうやって行うのか分からないでしょう。

+1

リソースクローズは、[本当にトリッキーな]ので、多くの練習が必要です(http://illegalargumentexception.blogspot.de/2008/10/java-how-not-to-make-mess-of-stream.html) – zapl

+0

@ zapl素晴らしいリンクありがとう! –

2

短い回答 - はい。 1つは、あなた自身の後ろをきれいにしないように、人生のあらゆる他の領域にあるように、厳密なコーディング慣行です。別の方法として、オペレーティングシステムがJava環境にリソースが不要になったことをオペレーティングシステムが認識するかどうかを予測することはできません。強制的に再起動せずに解放できないファイル/ etcをロックする可能性があります。

開いているリソースは、常にクリーンアップしてください。

元の質問に対する更新に関するアップデート - 開いているリソースを閉じるためにtry/catchブロックを追加するのに5秒かかるため、コンピュータの再起動に5分かかることがありません。それを行うことは、常に最後に時間を節約します。私のお父さんは、本当の怠惰な人が最初に正しいことをするので、戻って来る必要はないと私にいつも言いました。私はちょうど怠け者ではなく、正しいことを言っています。キャッチブロックを書き込むのに5秒かかるため、書き込みプロセスが大幅に遅くなることはありません。書き留めないで5秒間保存すると、デバッグが大幅に遅くなる可能性があります。

+1

「あなた自身の後ろをきれいにしてはいけない、それは他のあらゆる生活領域にあるように」、よく言われました! –

+2

ありがとうございました。本当に私はとても怠け者ではありません。私は自分のコードでリソースを閉じます。ただ、私は公理が好きではなく、「誰もがやるから」ということをやっていないことだけです。そういうわけで私は故意にそのような論争の問題を定式化したのです。そして、私が嫌いだが、冗長で醜いコードがJavaで要求されるのは、この5秒だけではない。試しにリソースを導入したJava7に切り替える必要があります。 –

+0

私はまだJava 7の新しい "リソースで試してみる"機能を使っていませんが、あなたに同意します:) – StormeHawke

5

あなたは、オペレーティング・システムとサーバoccurs.because資源の枯渇が アプリケーション一般docs

による資源

ための上限制限を持っている場合は、アプリケーション・サーバーへのリードは頻繁に再起動されて資源を、閉じていない場合

典型的なJavaアプリケーションでは、 ファイル、ストリーム、ソケット、およびデータベース接続など、いくつかのタイプのリソースを操作します。これらのリソースは、 である必要があります。 eir 操作です。したがって、エラーが発生しても解放されるようにする必要があります。

実際

は、間違ったリソース管理は、通常の落とし穴は、例外が どこかで発生した後に開かれたままのデータベース接続 とファイル記述子であることと、 本番アプリケーションの障害の共通のソースでありますオペレーティングシステムとサーバー アプリケーションは一般的にリソースの上限を持っているため、リソース消耗が発生するとアプリケーションサーバーが頻繁に再起動されます。 close文を嫌っているプログラマのためのJava 7で導入された

try-with-resources声明。

+1

+1 'try-with-resources'に関する良いヒント。 Java 5の暗黒時代にはまっていたので、私はその存在を知らなかった。 – splungebob

関連する問題