Findbugs使我迷惑了一个打开两个Closeable
实例的方法,但是我不明白为什么。
public static void sourceXmlToBeautifiedXml(File input, File output)
throws TransformerException, IOException, JAXBException {
FileReader fileReader = new FileReader(input);
FileWriter fileWriter = new FileWriter(output);
try {
// may throw something
sourceXmlToBeautifiedXml(fileReader, fileWriter);
} finally {
try {
fileReader.close();
} finally {
fileWriter.close();
}
}
}
Findbugs告诉我
Method [...] may fail to clean up java.io.Reader [...]
并指向与 FileReader fileReader = ...
谁错了:我还是Findbugs?
FindBugs是正确的:如果FileWriter的构造函数引发异常,则不会关闭文件阅读器。要验证这一点,请尝试为传递无效的文件名output
。
我将按照以下步骤进行操作:
FileReader fileReader = new FileReader(input);
try {
FileWriter fileWriter = new FileWriter(output);
try {
// may throw something
sourceXmlToBeautifiedXml(fileReader, fileWriter);
} finally {
fileWriter.close();
}
} finally {
fileReader.close();
}
请注意,关闭时抛出的异常的处理可能会得到改善,因为通过抛出异常离开finally-block将导致try语句通过抛出该异常而终止,吞噬try-
block中抛出的任何异常,这通常是对调试更有用。有关如何避免这种情况的简单方法,请参见duffymo的答案。
编辑 :从Java 7开始,我们可以使用try-with-resources语句,该语句允许对这些极端情况进行正确和简洁的处理:
try (
FileReader fileReader = new FileReader(input);
FileWriter fileWriter = new FileWriter(output)
) {
// may throw something
sourceXmlToBeautifiedXml(fileReader, fileWriter);
}
问题内容: Jenkins是否可以管理一些资源?我的意思是说,只有一定数量的作业可以并行运行。例如,我的许可证服务器只能提供4个许可证,因此使用该许可证的每个作业应首先检查某个计数器是否大于零,然后再减少并在不再需要许可证后递减。有排除插件,但我认为它只能创建互斥(计数器等于1),不能创建信号量(计数器等于1或更大)。脚本中的简单变量不是解决方案,因为主机和所有从机必须可见同一计数器。有什么想法如
我试图完全清理资源组在Azure。 删除资源组不是选项(访问权限:参与者,而不是所有者) 做到这一点的最优雅和明显的方法(也在一些文章中描述)是使用“空”部署模板执行完整的部署: 删除SQL Server开始“...”接受“...”失败“...”开始“...”接受“...”失败“... 你想到主意了。 其他时候效果很好。 您将得到数据库删除的无限循环“开始..接受..失败..开始..接受..失败.
问题内容: Java程序员知道JVM运行垃圾回收器,而System.gc()只是建议JVM运行垃圾回收器。如果我们使用System.gc(),并不一定会立即运行GC。 如果我误解了Java的垃圾收集器,请纠正我。 除了依赖Java的Garbage Collector之外,还有其他方法可以进行内存管理吗? 如果您打算通过某种有助于管理内存的编程实践来回答问题,请这样做。 问题答案: 关于Java内存
资源管理器 是我们用来访问和管理项目资源的工作区域。在开始制作游戏时,添加资源到这里通常是必须的步骤。您可以使用 HelloWorld 模板新建一个项目,就可以看到 资源管理器 中包含了一些基本资源类型。 界面介绍 资源管理器 将项目资源文件夹中的内容以树状结构展示出来,注意只有放在项目文件夹的 assets 目录下的资源才会显示在这里。关于项目文件夹结构说明请阅读 项目结构 一节。下面我们介绍各
为了管理异构和不同配置的主机,为了便于Pod的运维管理,Kubernetes中提供了很多集群管理的配置和管理功能,通过namespace划分的空间,通过为node节点创建label和taint用于pod的调度等。
资源管理器 面板是我们用来访问和管理项目资源的重要工具。 在开始制作游戏时,导入资源 通常是必须的步骤。您可以在新建项目时使用模板项目,新建步骤完成后会自动打开项目,默认布局中包含了 资源管理器 面板,里面有两个资源库,简称 DB,assets 和 internal, internal 属于默认的内置资源,内置资源可以复制出来,但不能直接修改。 面板操作预览 面板介绍 资源管理器 面板上主要有 头