下面这个可怜的小程序并不能干脆的做决定。它的decisive方法将返回true。但是它也返回false。那么,它到底打印的是什么呢?甚至,合法吗?
class Indecisive
{
public static void main(String[] args)
{
System.out.println(decisive());
}
static boolean decisive()
{
try
{
return true;
}
finally
{
return false;
}
}
}
你可能认为这个程序不合法。毕竟,decisive方法不能同时返回true和false。如果你尝试一下,就会发现它
编译时没有任何错误,并且它打印的是false。为什么呢?
原因在于就是在:在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行。无论try
语句块是正常结束的,还是意外结束,情况都是如此。在一条语句或一个语句块抛出一个异常,或者对某个封闭类型语句执行了一个break或continue,或是像这个程序一样执行了一个return时,将发生意外结束。之所以称为意外结束,是因为它们阻止程序按顺序执行下面的语句。
当try语句块和finally语句块都意外结束时,在try语句块中引发意外结束的原因将被丢弃,而整个try-finally
语句意外结束的原因将与finally语句块意外结束的原因相同。在这个程序中,在try语句块中的return语句所
引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。简单的讲,程序
尝试着(try)返回(return)true,但是它最终(finally)返回(return)的是false。
总之,每一个finally语句块都应该正常结束,除非抛出不受检查的异常。千万不要用return,break,continue或throw来退出finally语句块,并且千万不要允许让受检查的异常传播到finally语句块之外。