[英]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
語句中調用方法並將日志語句添加到try
和finally
塊時,這一點非常明顯。 相關的解釋可以在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.