漂泊的年华
北飘一族
posts - 5,comments - 0,trackbacks - 0
下面这个可怜的小程序并不能干脆的做决定。它的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语句块之外。

posted on 2007-01-10 14:20 迪蓝 阅读(143) 评论(0)  编辑  收藏 所属分类: puzzled

只有注册用户登录后才能发表评论。


网站导航: