我正在编写一个从容器中分离数据的函数,并返回分离的元素数量:
int detach(foo f)
{
try {
/*some code*/
return m_ids.size();
} finally {
m_ids.clear();
}
}
foo
是一个接收m_ids
java.util.List
数据的对象。
我担心:这段代码安全吗?在它被清除之前它会返回m_ids
的大小吗?
答案 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块将永远不会执行。