返回容器大小然后在finally块中更改该容器是否安全?

时间:2016-07-05 10:41:40

标签: java

我正在编写一个从容器中分离数据的函数,并返回分离的元素数量:

int detach(foo f)
{
    try {
        /*some code*/
        return m_ids.size();
    } finally {
        m_ids.clear();
    }
}

foo是一个接收m_ids java.util.List数据的对象。

我担心:这段代码安全吗?在它被清除之前它会返回m_ids的大小吗?

3 个答案:

答案 0 :(得分:9)

代码是安全的。在到达finally块之前,建立(并存储在某处)返回值。运行finally块后,存储的返回值将发送给函数调用者。

请注意,如果您以较差的编码样式编写return m_ids.size();作为finally块中的最后一个语句,那么0将返回给调用者:return值在finally块中会覆盖任何其他return值。

答案 1 :(得分:1)

检查生成的字节码:

int detach(java.util.List);
    Code:
       0: aload_1
       1: invokeinterface #4,  1  // InterfaceMethod java/util/List.size:()I
       6: istore_2
       7: aload_1
       8: invokeinterface #5,  1  // InterfaceMethod java/util/List.clear:()V
      13: iload_2
      14: ireturn
      15: astore_3
      16: aload_1
      17: invokeinterface #5,  1  // InterfaceMethod java/util/List.clear:()V
      22: aload_3
      23: athrow

istore_2是将size的结果存储到局部变量中的操作,然后加载(iload_2)并返回。

答案 2 :(得分:-5)

如果没有抛出异常,你的finally块将永远不会执行。