刚刚看到前人写的Code类似下面这样的Function,
public String greeting(boolean malicious) throws Exception{
try{
if(malicious){
throw new Exception("是在哈囉!");
}
}catch(Exception ex){
throw ex;
}finally{
return "Hello World!";
}
}
这Function,怎么看怎么怪,
如果我呼叫 greeting(true) 会回我什么结果?
事实上不管怎么改 Exception 的型态,例如
public String greeting(boolean malicious) throws IOException{
try{
if(malicious){
throw new SQLException("是在哈囉!");
}
}catch(Exception ex){
throw new IOException(ex.getMessage());
}finally{
return "Hello World!";
}
}
永远都会回传Hello World!
后来找了一下stackoverflow,人家指到
https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2
原来里面讲了,意思大概如下:
try - finally 述句首先执行 try 区块,然后选择
A.如果try块的执行正常完成,则执行finally块,然后选择下列其一:
a.如果 finally 区块正常完成,则try述句正常完成
b.如果因为 S 原因完结,则try述句因S而完结(我的理解是例如finally中间因S出现ret
urn或例外)
B.如果try块的执行因throw V而完结,然后选择下列其一:
a.如果执行时期V的Class被宣告在catch区块,则第一个符合的catch区块被执行,然后
选择下列其一:
…不管怎么说,都会执行 finally 区块
b.如果执行时期V的Class不在catch区块内,则执行 finally 区块,然后选择下列其一
…
所以不管如何finally都会执行,符合印象中,finally一定会被执行的记忆,
所以rethrow Exception 根本是多余的。