java8中的ByteArrayOutputStream异常处理

0 java io exception bytearrayoutputstream resource-leak

private void logSoapMessage(SOAPMessage soapMessage, String type) {
        ByteArrayOutputStream bout = null;
        try {
            bout = new ByteArrayOutputStream();
            soapMessage.writeTo(bout);
            logger.info("The " + type + " is " + bout.toString("UTF-8"));
        } catch (IOException e) {
            logger.debug("Exception while logging soap message " + e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码会出现资源泄漏错误吗?

Ste*_*n C 5

上面的代码会出现资源泄漏错误吗?

这不是资源泄漏。不在 Java 8 中,或者(AFAIK)在任何其他版本中。(这也不是内存泄漏。)

AByteArrayOutputStream没有任何可能泄漏的资源1 。事实上,on a的文档表明它没有任何作用。close()ByteArrayOutputStream

然而,不成熟的静态检查器可能会错误地将您的代码标记为潜在的资源泄漏。您可以以适当的方式将其标记为“误报”,或者直接关闭流。以下是针对 Java 7 及更高版本执行后者的最佳方法:

    try (ByteArrayOutputStream bout = new ByteArrayOutputStream()) {
        soapMessage.writeTo(bout);
        logger.info("The " + type + " is " + bout.toString("UTF-8"));
    } catch (IOException e) {
        logger.debug("Exception while logging soap message " + e);
    }
Run Code Online (Sandbox Code Playgroud)

请注意,“泄漏”保护并不是绝对必要的。我们这样做只是为了阻止检查员向我们提供虚假报告。


1 - 资源是指从操作系统获取的文件描述符等内容,并且通常数量有限。如果 Java 应用程序未正确管理这些资源,则应用程序可能会耗尽这些资源。持有资源的对象通常要实现AutoClosable并提供close()释放资源的方法。这些对象通常会使用终结器或清理器或类似的方法来清理泄漏的资源。然而,这可能不足以防止出现问题;例如,取决于 GC 是否足够快地将对象识别为不可访问以触发清理。