如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。
以下情形,finally块将不会被执行:
1、finally块中发生了异常;
2、程序所在的线程死亡;
3、在前面的代码中用了System.exit();//中断程序,退出Java虚拟机
4、关闭CPU
//异常示例
import java.io.*;
import java.net.*;
public class Demo148 {
public static void main(String[] args) {
FileReader fr=null;
//检查异常
//1、打开不存在的文件
//FileReader fr=new FileReader("d:\\aa.txt");
try { //使用try{}catch(Exception e){}将可能出错的程序放入到里面,当出错时会有相应提示,便于解决bug
//在出现异常的地方就终止执行代码,然后直接进入到catch语句
//如里有多个catch语句,则进入匹配异常的catch语句输入出信息
fr=new FileReader("d:\\aa.txt");
//System.exit(-1); //使用System.exit()后finally语句块不再执行
Socket s=new Socket("192.168.1.1",21);
} catch (FileNotFoundException e) {//catch(Exception e)捕获所有错误信息,为了方便一般使用此方法来捕获所有错误信息
// 把异常的信息输出,利于排除bug
//e.getMessage();
System.out.println("文件不存在:"+e.getMessage());//.getMessage()不如.printStackTrace()
//e.printStackTrace(); //输出bug信息
//处理
} catch (IOException e2){//UnknownHostException
e2.printStackTrace();
} finally {
//try..catch..语句块中不管出没出现异常,一般都会执行finally语句块
//一般说,把需要关闭的资源。如[文件]、[链接]、[内存]...
System.out.println("测试进入finally语句块");
if(fr!=null){
try {
fr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println("OK1");