1、finally對返回值的影響
我們知道finally在try中return語句執行之后 返回之前 執行的。
如果try中最后return一個變量 ,那finally也對這個變量修改后 到底會返回什么?
直接上測試代碼看例子:
class YfModel{ private String name; public YfModel(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class ExceptionYf { public static int getIntValue1(){ int result =9; try{ result++; return result; }finally { //修改result的值 result++; } } public static int getIntValue2(){ int result =9; try{ result++; return result; }finally { //finally里直接return return ++result; } } public static String getStringValue(){ YfModel yfModel = new YfModel("default"); try{ yfModel.setName("yy"); return yfModel.getName(); }finally { //finally里修改對象的屬性值 yfModel.setName("ff"); } } public static YfModel getModelValue(){ YfModel yfModel = new YfModel("default"); try{ yfModel.setName("yy"); return yfModel; }finally { yfModel.setName("ff"); } } public static void main(String[] args){ System.out.println("valueInt1="+ getIntValue1()); System.out.println("valueInt2="+ getIntValue2()); System.out.println("valueStr="+ getStringValue()); System.out.println("valueModel="+ getModelValue().getName()); } }
上述代碼返回結果:
valueInt1=10
valueInt2=11
valueStr=yy
valueModel=ff
結論:
a、對於基本類型或常量(如String) finally里即使修改了,也不會影響返回結果。
b、如果是對象類型,finally里修改了對象 是影響返回結果的。(因為復雜對象傳遞的是指針 指針指向的內存區域是一樣的。)
所以不要在finally里return。這不是常規做法。
2、finally里不要再拋出異常
finally里再有異常 需要在finally里就捕獲 打日志,不要再往外拋出,否則會覆蓋try catch中原有的異常信息。
3、finally一定會執行嗎
通常來說finally塊一定會執行,常用於關閉流操作。
但如果try catch里執行了System.exit操作 表示虛擬機終止,則不會再執行finally。
