关于try..catch中的final子句:
package com.javase.Exception; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; /* 关于try..catch中的final子句: 1 在finally字句中的代码是最后执行的,并且一定会执行。及时try语句块中的代码出现了异常,他也会执行。 finally子句必须和try一起出现,不能单独编写。 2 finally语句通常使用在哪些情况下呢? 通常在finally语句块中完成资源的释放/关闭。 因为finally中的代码比较有保障。 即使try语句块中的代码出现异常,finally中代码也会正常执行。 */ public class ExceptionTest10 { public static void main(String[] args) { FileInputStream fls = null;// 声明位置当到try外面,这样在finally中才能用。 try { // 创建输入流对象 fls = new FileInputStream("C:\jetbrains-agent.jar"); // 开始读文件... // String s = null; // 这里一定会出现空指针异常! s.toString(); // 流使用完需要关闭,因为流是占用资源的。 // 及时以上程序出现异常,流也必须要关闭。 // 放在这里流可能关闭不了 fls.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (NullPointerException e){ e.printStackTrace(); } finally { System.out.println("finally 执行啦!"); // 流的关闭放在这里比较保险。 // finally中的代码一定会执行的。 // 即使try中出现了异常。 if(fls != null){ try { // close方法有异常,采用捕捉的形式。 fls.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("Hello World!"); } }
finally语句块中的代码是一定会执行的【再次强调。】
package com.javase.Exception; /* finally语句 放在finally语句块中的代码是一定会执行的【再次强调。】 */ public class ExceptionTest11 { public static void main(String[] args) { /* try和finally,没有catch可以吗?可以。 try不能单独使用。 try finally可以联合使用。 以下代码的执行顺序: 先执行try... 在执行finally... 最后执行 return(return语句只要执行方法必然结束。) */ try { System.out.println("try..."); return; } finally { // finally中的语句会执行。能执行到。 System.out.println("finally"); } // 这里不能写语句,因为这个代码是无法执行到的。 // System.out.println("Hello World!");//Unreachable statement } }
什么情况下finally语句不会执行:
package com.javase.Exception; public class ExceptionTest12 { public static void main(String[] args) { try { System.out.println("try..."); // 退出JVM System.exit(0); } finally { // finally中的代码不会执行。 System.out.println("finally"); } } }