私は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;
}