关于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 */