例子非常的简单,是一个读取文件的例子。这样的例子在JDBC操作中也非常的常见。(所以,我觉得对于资源的及时正确清理是一个程序员的基本素质之一。)
  Try…finally结构也是保证资源正确关闭的一个手段。如果你不清楚代码执行过程中会发生什么异常情况会导致资源不能得到清理,那么你用try对这段”可疑”代码进行包装,然后在finally中进行资源的清理。举一个例子:
  public void readFile(){
  BufferedReader reader=null;
  try{
  reader=new BufferedReader(new InputStreamReader(
  new FileInputStream("file")));
  //do some other work
  //close reader
  reader.close();
  }catch(FileNotFoundException e){
  e.printStackTrace();
  }catch(IOException e){
  e.printStackTrace();
  }
  }
  我们注意一下这个方法和上一个方法的区别,下一个人可能习惯更好一点,及早的关闭reader。但是往往事与愿违,因为在reader.close()以前异常随时可能发生,这样的代码结构不能预防任何异常的出现。因为程序会在异常出现的地方跳出,后面的代码不能执行(这在上面应经用实例证明过)。这时我们可以用try…finally来改造:
  public void readFile(){
  BufferedReader reader=null;
  try{
  try{
  reader=new BufferedReader(new InputStreamReader(
  new FileInputStream("file")));
  //do some other work
  //close reader
  }finally{
  reader.close();
  }
  }catch(FileNotFoundException e){
  e.printStackTrace();
  }catch(IOException e){
  e.printStackTrace();
  }
  }
  及早的关闭资源是一种良好的行为,因为时间越长你忘记关闭的可能性越大。这样在配合上try…finally保证万无一失了(不要嫌麻烦,java是这么中规中矩)。
  再说一种情况,假如我想在构造方法中打开一个文件或者创建一个JDBC连接,因为我们要在其他的方法中使用这个资源,所以不能在构造方法中及早的将这个资源关闭。那我们是不是没辙了呢?答案是否定的。看一下下面的例子:
  public class ResourceInConstructor{
  BufferedReader reader=null;
  public ResourceInConstructor(){
  try{
  reader=new BufferedReader(new InputStreamReader(new FileInputStream("")));
  }catch(FileNotFoundException e){
  e.printStackTrace();
  }
  }
  public void readFile(){
  try{
  while(reader.readLine()!=null){
  //do some work
  }
  }catch(IOException e){
  e.printStackTrace();
  }
  }
  public void dispose(){
  try{
  reader.close();
  }catch(IOException e){
  e.printStackTrace();
  }
  }
  }
  这一部分讲的多了一点,但是异常确实是看起来容易用起来难的东西呀,java中还是有好多的东西需要深挖的。