2016-04-04 10 views
-2

私は初心者です。私はこのコードを書いてあり、そこにリソースリークがあることを示しています。Javaのリソースリーク警告

Scanner scan = new Scanner(System.in); 
    int i = scan.nextInt(); 

この意味は?不愉快なのは残念です。

+1

あなたのスキャナを決して閉じてしまわないようにしてください。そうすれば、リソースが "漏洩"する可能性があります。 – callyalater

答えて

0

これは、スキャナを閉じていないために発生します。 Javaガベージコレクタはメモリだけを管理し、他のリソースに対しては明示的に閉じる必要があります。 使用

scan.close(); 

はそれが役に立てば幸い!

0

Scannerは、Closeableインターフェイスを実装しています。つまり、ある時点で閉じる必要があるため、警告が表示されます。しかし、私はあなたがここにたとえば、あなたが探している答えを見つけるだろうと思う:Close a Scanner linked to System.in

0

あなたはそれを使用した後、そのリソースをクローズすることはありません、ドキュメントスキャナが実装

クラス近くでなければならないことを言いますインターフェース(JDK 1.5以降)java.io.Closeable(JDK 1.7以降) とjava.lang.AutoCloseableが と考えられるそれらがある場合、(方法 近いを用いて閉鎖されなければならない外部リソースなど)を表しませんもっと長く必要。

Eclipse Javaコンパイラは、このような タイプを使用するコードがこのポリシーに準拠しているかどうかを分析できます。

...

コンパイラ "リソースリーク: 'ストリーム' は、閉じたことはありません" となりますフラグ[違反]。

1

何が起こっているかは、スキャナが終了することがないため、リソースが「漏洩」している可能性があります。これは、JVMがオブジェクトの背後にあるオブジェクト(リソース)の割り当て、割り当て解除、および管理をしていることを意味し、Scannerオブジェクトがまだ使用されているかどうか、またはメモリを解放できるかどうか(ガベージコレクション)何かのために。リソースがクローズされると、そのリソースをクリーンアップできることをガベージコレクタに知らせます。それはヨーグルトの容器をたくさん開いて、家の周りに横たわっているようなものです。あなたはまだそれらを食べていますか、または彼らは冷蔵庫に戻すことができますか?

これにはいくつかの解決策があります。 1つは、スキャナのclose()メソッドを明示的に呼び出すことです。しかし、リソースを管理するもう一つの、よりクリーンな方法があります。

Java 7では、"try-with-resources"が導入されました。これは、プログラマがリソースを閉じるのを「忘れる」のが一般的であったためです。これにより、JVMがリソースを簡単に管理できるようになります。

try(Scanner scan = new Scanner(System.in)) 
{ 
    int i = scan.nextInt(); 
} 
catch(Exception e) {} 
finally {} 

リソースを試して使用しての追加の利点は、それが発生する可能性があり、すべての例外的な状況を考慮して、プログラマに思い出させることです。たとえば、ユーザーがコマンドラインでintの代わりに文字を入力した場合はどうなりますか?処理中に何か例外がスローされ、その実行拠点でスキャナを閉じるのを忘れた場合はどうなりますか?リソースを試そうとすると、これを単純化してコードをより簡潔かつ読みやすいものにすることができます(適切に使用されている場合)。