[Java]在返回(return)時使用finally

今天在看一題SCJP模擬考題的時候,赫然發現了課本Thinking in Java 4/e中文版一個錯誤,在返回(return)時使用finnaly這個錯誤題意,原文的題意是Using finally during return,看到這個finally了嗎?中文課本有錯誤喔!

好了,這其實只是個插曲,主要探討的是當try + return + finally時,它的流程是怎樣去做的?

主因是我從C、PHP回過來學Java的,那時PHP還沒exception的處理,PHP5之後,有了try、catch的使用,但也還沒有finally的用法,所以當出現下面這樣的題目時,我就很自然的以為,就return了,不會跑finally區塊的程式,誤解了Java中finally實際的用意。

What will be output if you try to compile and run the following code, but there is
no file called Hello.txt in the current directory?.

import java.io.*;
public class Mine {
    public static void main(String argv[]){
	Mine m=new Mine();
	System.out.println(m.amethod());
    }
    public int amethod() {
	try {
	    FileInputStream dis=new FileInputStream("Hello.txt");
	}catch (FileNotFoundException fne) {
	    System.out.println("No such file found");
	    return -1;
	}catch(IOException ioe) {
	} finally{
	    System.out.println("Doing finally");
	}

	return 0;
    }

}

1) No such file found
2 No such file found ,-1
3) No such file found, Doing finally, -1
4) 0

我就查了三本書,看一看try、return、finally存在時,程式的流程如何?課本Java 2教學手冊–JDK 5版(CD*1)的p.351有這樣一個區塊這樣解釋:

使用try程式區塊的主要用途在於識別可能導致例外情況被擲出的程式碼,不過,也可用它來包含不會擲出例外情況的程式碼,因為此時就利用finally程式區塊一定會被執行的特性。當try程式區塊的程式碼有數個結束點時,例如break或return敘述,這種方式是很有幫助的。如果try程式區塊執行後,必須執行特定的敘述時,即可用此方法來確保要作的事都被完成了。例如,要關閉任何開啟的檔案時,即可將這些程式碼放到finally程式區塊裡。請注意:如果finally程式區塊有回傳值,其回傳將會覆蓋try程式區塊裡的任何回傳值。

看完這段話,只能說敝人才疏學淺,但也徹底理解了!

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *