3

私はEclipseJunoを使用しており、次のコードを書いているときに、Eclipseはメモリリークの可能性について警告します。

String s = new Scanner( System.in ).nextLine();

実際、System.inストリームを閉じることはありません。JVM(jre7)はこれをどのように処理しますか?それは良い使い方ですか?

4

3 に答える 3

3

これは誤警報だと思います。Eclipse は次のようなものと混同しています。

String s = new Scanner(new FileReader("foo.txt")).nextLine();

これ、実行するたびに新しい Closeable をリークします。

しかし、あなたのコードでは、基になるストリーム ( System.in) はまだ到達可能で使用可能です。確かに、「リソース漏れ」の観点から閉鎖する必要はありません。


実際、System.in ストリームを閉じることはありません。JVM (jre7) はこれをどのように処理しますか?

System.in(おそらく) アプリケーションが終了するまで、ストリームは開いたままになります。new Scanner(System.in)しかし、それは最初に電話をしなかった場合と同じです。

于 2012-10-11T12:19:46.133 に答える
0

私の答えは無効です。詳細についてはコメントを参照してください。OP、もう一つお受けします。

JVM は、ユーザーがリソースを閉じるか、プログラムが終了するまで、リソースを開いたままにします。Eclipse の警告は適切なようです。Java 7 では、try-with-resources パターンを使用できます。

try (Scanner scanner = new Scanner(System.in)) {
    scanner.nextLine();
}

これにより、try ブロックの最後でスキャナーが自動的に閉じられます。

于 2012-10-11T12:21:49.063 に答える
0

これは無視しても問題ありません。

それScannerもクローズ可能な場合は、基礎CloseableScanner::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;
}
于 2013-12-04T18:04:21.313 に答える