Will not closing a stringwriter cause a leak?
我意识到,在Java中,GC将最终清除对象,但我会问,如果不关闭字符串写入器,这是一个错误的做法,目前我正在这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | private static String processTemplate(final Template template, final Map root) { StringWriter writer = new StringWriter(); try { template.process(root, writer); } catch (TemplateException e) { logger.error(e.getMessage()); } catch (IOException e) { logger.error(e.getMessage()); } finally { } return writer.toString(); } |
我应该关闭编写器并创建这样的新字符串吗:
1 2 3 4 5 6 7 8 |
号
这样做更好吗?
JavaDoc非常明确:
Closing a StringWriter has no effect.
号
快速查看代码就可以确认:
1 2 |
它没有任何非内存资源。它将像其他任何东西一样被垃圾收集。close()可能仅仅存在,因为其他编写器对象确实拥有需要清理的资源,而close()需要满足接口。
不,不关闭
此外,您通常不应该关闭一个
1 2 3 | // Don't need to close StringWriter, since no external resource. Writer writer = new StringWriter(); // Do something with writer. |
号
如果要关闭编写器,最优雅的方法是使用try with resources,当退出try块体时,它将自动调用
1 2 3 4 |
但是,由于writer close()抛出了
1 2 3 4 5 6 7 8 9 10 11 | Writer writer = new StringWriter(); try { // Do something with writer, which may or may not throw IOException. return writer.toString(); } finally { try { writer.close(); } catch (IOException e) { throw new AssertionError("StringWriter#close() should not throw IOException", e); } } |
。
这一级别的样板文件是必要的,因为您不能将catch放在整个try块上,否则您可能会意外地吞下代码体抛出的
一个微妙的点是,不仅
总而言之:不关闭一个
在方法的末尾,没有对