不要在finally塊中處理返回值

2021-06-21 02:57:18 字數 969 閱讀 9519

一、分析

在finally中處理return返回值,**上看上去很完美,都符合邏輯,但是執行起來就會產生邏輯錯誤,最重要的一點是finally是用來做異常處理的收尾處理的,一旦加上return語句,就會讓程式的複雜程度陡然提公升,而且會在一些隱蔽性非常高的錯誤。

與return語句相似,system.exit(0)或runtime.getruntime().exit(0)出現在異常**塊中也會產生非常多的錯誤假象。

二、場景

如**如下:

public static void main(string args)catch(exception e)

}//該方法丟擲受檢異常

public static int dostuff(int _p)throws exceptionelse

}catch(exception e)finally

}

dostuff(-1)的值是-1,dostuff(100)的值也是-1,呼叫dostuff方法永遠都會丟擲異常。原因就是我們在finally**塊中加入了return語句,而回導致這兩個問題:

1.覆蓋了try**塊中的return返回值

當執行dostuff(-1)時,dostuff方法產生了dataformatexception異常,catch塊在捕捉此異常後直接丟擲,之後**塊執行到finally**塊,就會重置返回值,結果就是-1了,也就出現了先返回,在執行finally,在重置返回值的情況。

2.遮蔽異常

為什麼明明把異常throw出去了,但main方法捕捉不到呢?這是因為異常執行緒在監視到有異常發生時,就會登記當前的異常型別為dataformatexception,但是當執行器執行finally**塊時,則會重新為dostuff方法賦值,也就是告訴呼叫者「該方法執行正確,沒有產生異常,返回值是1」,於是乎,異常就神奇的消失了。

三、建議

不要在finally**塊出現return語句。

不能在finally塊中return

try catch塊中永遠返回finally中return的值 錯誤 static boolean f finally 錯誤分析 在這個應用場景中,不要用return來退出finally語句塊,因為finally語句塊都會被執行到,這樣try程式塊中執行正常也會在finally中退出,不會再回到tr...

finally中不要使用return的兩種情況

以下兩種情況要避免在finally中使用return 1.如果catch塊中捕獲了異常,並將該異常throw給上級呼叫者處理,但finally中return了,那麼catch塊中的throw就失效了,上級方法呼叫者是捕獲不到異常的 例 如下 上級呼叫者是捕獲不到異常的 public static v...

不要在公共介面中傳遞STL容器

最近的乙個專案,是開發乙個framework,提供給公司內部不同的產品線使用。之間遇到的乙個問題,就是stl容器的使用,而結論是不要在公共介面中傳遞stl容器 也可以說,不要在暴露給客戶的標頭檔案中包含stl的標頭檔案。為什麼有這個結論,我們可以從幾個方面來論述 雖然,微軟這篇文章提到匯出vecto...