之前的代码是这样的 -
try {
some other code
......
......
ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
DataInputStream dis = new DataInputStream(annoBais);
InputStream annoStream = dis;
inputRecord.put("XMLStream", annoStream);
MappedRecord resultMappedRecord = (MappedRecord)interaction.execute(interactionSpec,inputRecord);
HashMap mappedAnnotIds = (HashMap)resultMappedRecord.get(("ResultHashMap").toString());
annoStream.close(); //closed here
annoBais.close(); // closed here
dis.close(); // closed here
......
......
some more code
}
我把它改为 -
try {
some other code
......
......
@lombok.Cleanup ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
@lombok.Cleanup DataInputStream dis = new DataInputStream(annoBais);
@lombok.Cleanup InputStream annoStream = dis;
inputRecord.put("XMLStream", annoStream);
MappedRecord resultMappedRecord (MappedRecord)interaction.execute(interactionSpec,inputRecord);
HashMap mappedAnnotIds = (HashMap)resultMappedRecord.get(("ResultHashMap").toString());
......
......
some more code
}
@ lombok.Cleanup是否会拥有相同的范围?它会在之前手动关闭的地方关闭吗?如果没有,我怎么能以仍然具有相同范围的方式关闭它?
答案 0 :(得分:1)
在这里使用@lombok.Cleanup的正确方法是不使用lombok; Java7用try with resources解决了这个问题。
例如,使用您的代码:
some other code
......
......
try ( ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
DataInputStream dis = new DataInputStream(annoBais) ) {
InputStream annoStream = dis;
inputRecord.put("XMLStream", annoStream);
MappedRecord resultMappedRecord = (MappedRecord)interaction.execute(interactionSpec,inputRecord);
HashMap mappedAnnotIds = (HashMap)resultMappedRecord.get(("ResultHashMap").toString());
}
// annoBais & dis get closed here.
// Note: annoStream is an alias of dis, not a separate resource.
......
......
some more code
当然,此代码需要被try {} catch () {}
块包围,或者您的方法必须声明它throws
所需的例外。
使用"尝试使用资源"不会导致您必须处理其他异常。您总是需要处理所有已检查的异常,方法是捕获它们或声明您的方法抛出它们。
答案 1 :(得分:1)
使用
@lombok.Cleanup ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
@lombok.Cleanup DataInputStream dis = new DataInputStream(annoBais);
@lombok.Cleanup InputStream annoStream = dis;
所有三个资源都在结束时以与其声明相反的顺序关闭。 AFAIK,与try-with-resources完全相同。
@Cleanup
即使在某些关闭语句抛出时也能正常工作。这也是一样的。
它甚至适用于Java 6,但你真的不应该使用Java 6.
@Cleanup
具有更好的语法,但这是主观的。我正在停止使用它,因为try-with-resources是一个内置功能,肯定会得到永久或类似的支持。
同样使用try with resources会导致我处理其他一些例外。
绝对不是,这也必须是一样的。请注意,99%的情况下,您应该将该异常添加到throws子句中,或者将其包装并重新抛出。
请注意
@lombok.Cleanup InputStream annoStream = dis;
毫无意义,因为您没有获得新资源。所以
InputStream annoStream = dis;
会更好,因为没有什么新东西可以关闭。更好的是抛弃annoStream
,因为在一件事上有两个变量几乎没有意义。
幸运的是,多次调用close
是无害的。