0

之前的代码是这样的 -

    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 是否具有相同的范围?它会在之前手动关闭的地方关闭吗?如果没有,我怎样才能以它仍然具有相同范围的方式关闭它?

4

2 回答 2

6

在这里使用@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是必需的异常。

使用“尝试资源”不会导致您必须处理额外的异常。您总是需要处理所有已检查的异常,方法是捕获它们或声明您的方法抛出它们。

于 2017-08-01T17:42:39.010 回答
2

@lombok.Cleanup ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
@lombok.Cleanup DataInputStream dis = new DataInputStream(annoBais);
@lombok.Cleanup InputStream annoStream = dis;

所有三个资源都以与声明相反的顺序在右大括号处关闭。AFAIK,这与 try-with-resources 完全相同。

@Cleanup即使某些 close 语句抛出,也可以工作。这也是一样的。

它甚至适用于 Java 6,但你真的不应该使用 Java 6。

@Cleanup具有优越的语法,但这是主观的。我将停止使用它,因为 try-with-resources 是一个内置功能,肯定会得到永远或类似的支持。

对资源使用 try 也会导致我处理一些其他异常。

绝对不是,这也一定是一样的。请注意,99% 的情况下,您应该将异常添加到 throws 子句或包装并重新抛出它们。

注意

@lombok.Cleanup InputStream annoStream = dis;

没有意义,因为您没有获得新资源。所以

 InputStream annoStream = dis;

会更好,因为没有什么新东西要关闭。更好的是放弃,annoStream因为一件事有两个变量几乎没有意义。

close幸运的是,多次调用是无害的。

于 2017-08-07T13:19:57.657 回答