簡體   English   中英

嘗試/最后阻止問題

[英]try / finally block question

在這里找到這個問題

我無法理解,為什么在第一種情況下它打印CoolReturn+1和第二種情況CoolReturn 它是如何工作的?

謝謝

====================

什么會打印?

public void testFinally(){
    System.out.println(setOne().toString());

}

protected StringBuilder setOne(){
    StringBuilder builder=new StringBuilder();
    try{
        builder.append("Cool");
        return builder.append("Return");
    }finally{
        builder.append("+1");
    }
}

答案:CoolReturn + 1

有點困難:

public void testFinally(){
    System.out.println(setOne().toString());

}

protected StringBuilder setOne(){
    StringBuilder builder=new StringBuilder();
    try{
        builder.append("Cool");
        return builder.append("Return");
    }finally{
        builder=null;  /* ;) */
    }
}

答:CoolReturn

考慮

protected StringBuilder setOne(){
    StringBuilder builder=new StringBuilder();
    try{
        builder.append("Cool");
        return builder.append("Return");
    }finally{
        builder.append("+1");
    }
}

protected StringBuilder setOne(){
    StringBuilder builder=new StringBuilder();
    try{
        builder.append("Cool");
        StringBuilder ret = builder.append("Return"); // 1
        return ret; // 2
    }finally{
        builder.append("+1"); //3
    }
}

執行第1行,結果返回builder 然后執行第3行,並且builder附加+1 ,然后返回ret ,它是builder引用的對象的“引用”。 第二種情況也是如此。 希望很清楚。

第一個:

終於總會開火(假設機器沒有崩潰或任何事情)。 因此,在返回之后,finally塊將觸發,並且由於它具有對象“builder”的引用,因此它會將額外的標記附加到它。

第二個:

finally塊像以前一樣觸發,但它將對builder的引用設置為null。 該對象仍然存在,因為它仍然有一個鏈接。

當它返回builder.append(“返回”)時,對構建器變量的引用的副本將被壓入堆棧。 然后構建器設置為null。 然后調用者從堆棧中彈出引用的副本。

在第一個示例中,在finally塊中,您使用append操作字符串構建器。

在第二個示例中,在finally塊中,在從append方法返回結果后,將指向字符串構建器的指針更改為空指針。 這不會修改您以前以任何方式指向的字符串構建器。

編輯:看起來我被擊敗了。

finally運算符始終運行,因此返回構建器,然后返回+1。

在第二個,構建器設置為null,因此沒有其他任何內容可以添加到它。 在最后一個中,它可以很容易地成為builder =“”。

finally塊將始終執行。 http://download.oracle.com/javase/tutorial/essential/exceptions/finally.html這就是為什么要附加所有三個語句的原因。

這是有效的,因為在執行finally塊之前會計算return表達式。 當您在代碼的return語句中調用方法並將日志語句添加到tryfinally塊時,這一點非常明顯。 相關的解釋可以在JLS第3版,14.20.2中找到 這就是為什么finally塊中的return語句在IDE中像Eclipse一樣產生警告的原因之一。

樣本groovy代碼:

def doSomething() {
    def f = "something";
    try {
        return f += doSomethingMore()
    } finally {
        println "before nulling";        
        f = null;
        println "after nulling";
    }
}

def doSomethingMore() {
    println "doSomethingMore called"
    return "-wow";
}

println "output from call ---> " + doSomething()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM