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