[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程式区块里的任何回传值。

看完这段话,只能说敝人才疏学浅,但也彻底理解了!