关于try…catch中的finally子句
1、在finally子句中的代码是最后执行的,并且是一定执行的,即使try语句块中的代码块出现了异常
finally子句必须和try一起出现,不能单独编写
2、finally语句通常使用在哪些情况下呢?
通常在finally语句块中完成资源的释放/关闭
因为finally中的代码比较有保障
即使try语句块中的代码出现异常,finally中代码也会正常执行
示例代码01:
public class ExceptionTest10 { public static void main(String[] args) { FileInputStream fis = null;//声明位置放到try外面。这样在finally中才能使用 try { //创建输入流对象 fis = new FileInputStream("D:\\Noepad++\\config.xml"); //开始读文件。。。 String s = null; //这里一定出现空指针异常 s.toString(); System.out.println("HelloWorld"); //流使用完需要关闭,因为流是占用资源的 //即使以上的程序出现异常,流也要关闭 //放在这里有可能流关闭不了 //file.close(); } catch (FileNotFoundException e) { e.printStackTrace(); }catch(NullPointerException e){ e.printStackTrace(); }finally { System.out.println("Hello 浩克!"); //流的关闭放在这里比较安全 //finally中的代码是一定会执行的 //即使try中出现了异常 if(!(fis == null)){//避免空指针异常 try { //close()方法,采用捕捉的方式 fis.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("HelloWorld!"); } }
运行结果:
3、放在finally语句块中的代码是一定会执行的【再次强调!!】
示例代码02:
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("HelloWorld!"); } }
运行结果:
示例代码03:
public class ExceptionTest12 { public static void main(String[] args) { try{ System.out.println("try.."); // 退出JVM System.exit(0);// 退出JVM之后,finally语句中的代码就不执行了! }finally{ System.out.println("finally.."); } } }
运行结果:
4、finally面试题
代码:
//finally面试题 public class ExceptionTest13 { public static void main(String[] args) { int reValue = m(); System.out.println(reValue);//100 } public static int m(){ int i = 100; /* java语法规则(有一些规则是不能破坏的,一旦这么说了,就必须这么做!): java中有一条这样的规则: 方法体中的代码必须遵循自上而下顺序依次逐行执行(亘古不变的语法!) java中海油一条语法规则: return语句一旦执行,整个方法必须结束(亘古不变的语法!) */ try{ // 这行代码出现在int i = 100;的下面,所以最终结果必须是返回100 // return语句还必须保证是最后执行的。一旦执行,整个方法结束。 return i; }finally{ i++; } } } 运行结果: 100