太自由

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
关于Java中异常的一些总结:
  3     有些时候,程序在try块里打开了一些物理资源(例如数据库连接,网络连接、
  4     和磁盘文件等),这些物理资源都必须显示回收。
  5 
  6     注意:Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存
  7     中对象所占用的空间。
  8 
  9     异常处理语法结构中只有try块是必须的,也就是说,如果没有try块,则不能有后面
 10     的catch块和finally块;catch块和finally块都是可选的,但catch块和finally块
 11     至少出现其中之一,也可以同时出现;可以有多个catch块,捕获父类异常的catch
 12     块必须位于捕获子类异常的后面;但不能只有try块,既没有catch块(但是Java7的自动关闭
 13     资源的try语句中可以只有try块,其实它也是包含了隐式的finally块),也没有finally
 14     块;多个catch块必须位于try块后,finally块必须位于所有的catch块之后,
 15 
 16     例如下面的程序:
 1 package myclass;
 2 import java.io.IOException;
 3 import java.io.FileInputStream;
 4 public class FinallyTest 
 5 {
 6     public static void main(String[] args) 
 7     {
 8         FileInputStream fis = null;
 9         try
10         {
11             fis = new FileInputStream("a.txt");
12         }
13         catch (IOException ioe)
14         {
15             System.out.println(ioe.getMessage());
16             //return语句强制方法返回.
17             return;                    //(1)
18             //使用exit退出虚拟机.
19             //System.exit(0);          //(2)
20         }
21         finally
22         {
23             if(fis != null)
24             {
25                 try
26                 {
27                     fis.close();
28                     System.out.println("文件已成功关闭");
29                 }
30                 catch (IOException ioe)
31                 {
32                     ioe.printStackTrace();
33                 }
34             }
35             System.out.println("执行finally块里的资源回收!");
36         }
37     }
38 }
39 
40 /*
41 运行上面的程序,结果如下:
42 a.txt (系统找不到指定的文件夹。)
43 执行finally块里的资源回收!
44 
45 将(1)处的代码注释掉,取消(2)处的代码注释,运行程序结果如下:
46 a.txt (系统找不到指定的文件夹。)
47 
48 因为在异常处理块catch中使用System.exit(0)语句退出了JVM,所以不会执行到finally块。
49 
50 注意:除非在try catch块中调用了退出虚拟机的方法,否则不管在try块,catch块
51 中执行怎样的代码,出现怎样的情况,异常处理的finally块总会被执行。
52 在通常情况下,不要在finally块中使用如return或throw等导致方法终止的语句,
53 一旦在finally块中使用了return或throw语句,将会导致try块,catch块中的return
54 ,throw语句失效,看下面的程序,输出结果为false
55 ----------------------------------------------------------------------------
56 package myclass;
57 public class FinallyFlowTest
58 {
59     public static void main(String[] args)throws Exception
60     {
61         boolean a = test();
62         System.out.println(a);
63     }
64     public static boolean test()
65     {
66         try
67         {
68             return true;
69         }
70         finally
71         (
72             return false;
73         )
74     }
75 }
76 ---------------------------------------------------------------------------
77 
78 下面讲解一下System.exit(0)和System.exit(1)的区别。
79 System.exit(0) 正常退出
80 System.exit(1) 或参数为“非0”非正常退出
81 
82 但是 但是,“正常退出” 和 “非正常退出” 有什么区别?本人目前还不清楚。
83 */

 

posted on 2016-06-23 09:51  太自由  阅读(213)  评论(0编辑  收藏  举报