文章目录

  1. 1. 优柔寡断
    1. 1.1. 分析
    2. 1.2. 建议
    3. 1.3. 扩展
  2. 2. 你好,再见
    1. 2.1. 分析

摘自《Java解惑》。这些问题都很经典,可以细细品味。
今天讲解的问题如下,问题一:优柔寡断、问题二:你好,再见。

优柔寡断

public class Indecisive {  
  public static void main(String[] args){  
      System.out.println(decision());  
  }  
  public static boolean decision(){  
      try{  
          return true;  
      }  
      finally{  
          return false;  
      }  
  }  
}

分析

在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行的。无论try语句块是正常结束的,还是意外结束的,情况都是如此。

建议

每一个finally语句块都应该正常结束,除非抛出的是不受检查的异常。千万不要用一个return、break、continue或throw来退出一个finally语句块,并且千万不要允许将一个受检查的异常传播到一个finally语句块之外去。

扩展

面试题 try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

你好,再见

public class HelloGoodbye {  
  public static void main(String[] args){  
      try{  
          System.out.println("Hello,World!");  
          System.exit(0);  
      }finally{  
          System.out.println("Goodbye,world!");  
      }  
    }  
}

分析

不论try语句块的执行是正常地还是意外地结束,finally语句块确实都会执行。然而在这个程序中,try语句块根本就没有结束其执行过程。System.exit方法将停止当前线程和所有其他当场死亡的线程。finally子句的出现并不能给予线程继续去执行的特殊权限。System.exit将立即停止所有的程序线程,它并不会使finally语句块得到调用,但是它在停止VM之前会执行关闭挂钩操作。当VM被关闭时,请使用关闭挂钩来终止外部资源。通过调用System.halt可以在不执行关闭挂钩的情况下停止VM,但是这个方法很少使用。

(完)

微信公众号

文章目录

  1. 1. 优柔寡断
    1. 1.1. 分析
    2. 1.2. 建议
    3. 1.3. 扩展
  2. 2. 你好,再见
    1. 2.1. 分析