45

これは私のコードです:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;

public class temp {
    public static void main(String[] args) throws FileNotFoundException {
        BufferedReader a = new BufferedReader(new FileReader("a"));
        Scanner scanner = new Scanner(a).useDelimiter(",");
        scanner.close();
    }
}

私はそれで警告を受け取りnew Scanner(a)ます(私はjdk1.7.0_05でコンパイルしています):

Resource leak: '<unassigned Closeable value>' is never closed.

私は何か間違ったことをしていますか、それともこれは単なる誤った警告ですか?

4

4 に答える 4

67

このようにコードを分割すると、警告は消えますか?

  Scanner scanner = new Scanner(a);
  scanner.useDelimiter(",");
  scanner.close();
于 2012-07-13T02:30:01.333 に答える
13

はい、コードには潜在的な(しかし実際ではない)メモリリークがあります。の戻り値をuseDelimiter(a)ローカル変数scannerに割り当てますが、コンストラクターの結果は破棄されます。そのため、警告が表示されます。

実際には、の戻り値はuseDelimiter(a)コンストラクター呼び出しから返されるオブジェクトとまったく同じオブジェクトであるため、コードはリソースを適切に閉じます。しかし、これは、コンパイラ/コード分析ツールがそのためのuseDelimiters実装を知っている必要があるため、検出できないものです。

また、このメソッドで開かれていないリソース(useDelimiterの戻り値)を閉じているため、非常に優れたコード分析ツールで追加の警告が表示されるはずです。これらの2つのメッセージを一緒にした場合、症状はより明確になっている可能性があります。

于 2012-07-13T05:32:29.837 に答える
1

試してみましたか:

Scanner scanner = new Scanner(new BufferedReader(new FileReader("a"))).useDelimiter(",");

それが機能しない場合は、追加する必要がありますa.close();

于 2012-07-13T07:07:24.787 に答える
0

何があなたにこの警告を与えていますか?おそらく、割り当て/クローズがtry / finalブロックで行われないため、警告が表示されます。これは一般的に悪い考えです(ただし、この特定のケースでは、エラーをスローする可能性があるのは新しいFileReaderだけなので、問題はありません。実際に割り当てられたリソースはスローされませんが、1回のメソッド呼び出しで変更される可能性があります。)

スキャナーを閉じると、基になるストリームが閉じられます(正確には、それ自体を実装するものはすべてCloseable(はいBufferedReader)、コードはそれ以外は問題ありません。

于 2012-07-13T02:33:44.793 に答える