今天在看一題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程式區塊裡的任何回傳值。
看完這段話,只能說敝人才疏學淺,但也徹底理解了!