關於finally對返回值的影響


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());
    }
}
View Code

上述代碼返回結果:

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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM