当前位置: 首页 > 知识库问答 >
问题:

Eclipse警告潜在的资源泄漏尽管我有一个finally块关闭了最外面的流,但我缺少什么?

阚砚文
2023-03-14

Eclipse给我以下的资源泄漏警告有什么原因吗:resource leak:'br'is never close“?我所说的代码在本文的底部。

我以为我的最后一个区块已经把它都覆盖了,我的推理是:

  • 只有当FileInputStream构造函数抛出时,res才会为null,因此不需要关闭任何东西
  • 如果InputStreamReader构造函数抛出(例如,格式错误的编码字符串),则Res将是inputstream,然后只有inputstream必须关闭,所以OK
  • 等..

那我错过了什么?或者这可能是一个eclipse bug?

亲切的问候!

S.

public static String fileToString(String fileName, String encoding) throws IOException {
    InputStream is;
    InputStreamReader isr;
    BufferedReader br;
    Closeable res = null;
    try {
        is = new FileInputStream(fileName);
        res = is;
        isr = new InputStreamReader(is, encoding);
        res = isr;
        br = new BufferedReader(isr);
        res = br;
        StringBuilder builder = new StringBuilder();
        String line = null;
        while ((line = br.readLine()) != null) {
            builder.append(line);
            builder.append(LS);
        }
        return builder.toString();
    } finally {
        if (res != null) {
            res.close();
        }
    }
}

共有1个答案

林修雅
2023-03-14

Eclipse可能只是不理解您对res变量所做的调整。

我推荐使用try-with-resources语句(在Java ;7及更高版本中可用,现在已经有三年半了),它极大地简化了这些类型的链:

public static String fileToString(String fileName, String encoding) throws IOException {

    try (
        InputStream is = new FileInputStream(fileName);
        InputStreamReader isr = new InputStreamReader(is, encoding);
        BufferedReader br = new BufferedReader(isr)
    ) {
        StringBuilder builder = new StringBuilder();
        String line = null;
        while ((line = br.readLine()) != null) {
            builder.append(line);
            builder.append(LS);
        }
        return builder.toString();
    }
}

如果您不能使用try-with-resources,那么您可能需要类似于Apache Commons的ioutils类的closequiete方法(可以是该方法,也可以是您自己的方法),而不是将res到处乱放,这样读起来会很尴尬,而且我敢说很容易出现维护问题。

使用IOUTILS可能如下所示:

public static String fileToString(String fileName, String encoding) throws IOException {
    InputStream is = null;
    InputStreamReader isr = null;
    BufferedReader br = null;

    try {
        is = new FileInputStream(fileName);
        isr = new InputStreamReader(is, encoding);
        br = new BufferedReader(isr)
        StringBuilder builder = new StringBuilder();
        String line = null;
        while ((line = br.readLine()) != null) {
            builder.append(line);
            builder.append(LS);
        }
        br.close();
        return builder.toString();
    }
    finally {
        IOUtils.closeQuietly(br, isr, is);
    }
}

请注意我是如何在try中使用普通的close的,但然后确保在finally中进行清理的。

但是尝试使用资源是更好的答案,因为它更简洁,并且与新的(ish)“被抑制的异常”相关联。

附带说明:=null初始化没有任何原因,您可以在下一行指定它。

边注2:如果文件很可能是任意大小的,请考虑提前找出它有多大,并在构造函数中设置StringBuilder的容量。StringBuilder的默认容量是16,因此即使是几百html" target="_blank">字节的文件也需要重新分配StringBuilder的内部缓冲区。

 类似资料:
  • eclipse“潜在资源泄漏”警告不正确。 没有警告: 警告:潜在资源泄漏:“此位置可能未关闭响应” 为什么第二种方法会引起警告? 谢谢!

  • 这里的代码给出了。如果我在try块中关闭f,它可以工作,但是如果我将放在finally块中,它就不工作了。它显示错误。那有什么问题? 因此,程序应该从用户那里获取输入并将其保存在.doc文件中,然后从同一文件中读取数据并打印出来。如果还不是很明显的话,我正在学习Java。 因此,代码可以工作,但我注意到有一个警告,没有关闭。我将语句放在块中。它在那里显示了一个错误。 close语句在块中但无法识别

  • 在中,我收到了一个警告,我不明白这一点。 这是理解问题还是java/eclipse问题?

  • 我有一个连接到MySQL的服务方法,可以在中获取数据,最后在

  • 我使用一个用不同长度的不同值填充字节数组。我使用方法。由于此方法继承自,因此可能会引发IOException。在中有一个方法不会引发IOException,因此我扩展了并覆盖方法,该方法现在也不会引发IOException: 对于扩展类,我在eclipse 4.5.1中得到了资源泄漏的警告,因为我没有关闭代码中的流。的情况并非如此。我的扩展类有什么问题,或者我需要添加什么来删除警告?我知道我可以将