私はEclipseJunoを使用しており、次のコードを書いているときに、Eclipseはメモリリークの可能性について警告します。
String s = new Scanner( System.in ).nextLine();
実際、System.inストリームを閉じることはありません。JVM(jre7)はこれをどのように処理しますか?それは良い使い方ですか?
これは誤警報だと思います。Eclipse は次のようなものと混同しています。
String s = new Scanner(new FileReader("foo.txt")).nextLine();
これは、実行するたびに新しい Closeable をリークします。
しかし、あなたのコードでは、基になるストリーム ( System.in
) はまだ到達可能で使用可能です。確かに、「リソース漏れ」の観点から閉鎖する必要はありません。
実際、System.in ストリームを閉じることはありません。JVM (jre7) はこれをどのように処理しますか?
System.in
(おそらく) アプリケーションが終了するまで、ストリームは開いたままになります。new Scanner(System.in)
しかし、それは最初に電話をしなかった場合と同じです。
私の答えは無効です。詳細についてはコメントを参照してください。OP、もう一つお受けします。
JVM は、ユーザーがリソースを閉じるか、プログラムが終了するまで、リソースを開いたままにします。Eclipse の警告は適切なようです。Java 7 では、try-with-resources パターンを使用できます。
try (Scanner scanner = new Scanner(System.in)) {
scanner.nextLine();
}
これにより、try ブロックの最後でスキャナーが自動的に閉じられます。
これは無視しても問題ありません。
それScanner
もクローズ可能な場合は、基礎Closeable
とScanner::close
なるリーダーもクローズします。
以下は のコードですScanner::close
。
public void close() {
if (closed)
return;
if (source instanceof Closeable) {
try {
((Closeable)source).close();
} catch (IOException ioe) {
lastException = ioe;
}
}
sourceClosed = true;
source = null;
closed = true;
}