背景:为了保证一定能回收try块里打开的物理资源,异常处理机制提供了finally块
Java异常处理机制:
1.当try语句块内容执行出错,系统会自动生成一个异常对象,将该异常对象交给JRE,这就是我们所说的抛出(throw)异常
2.jre拿到异常对象,去catch块找匹配的异常对象类型,将异常对象传给catch块的形参,交给catch块做异常处理,这就是我们所说的捕获(catch)异常
3.当程序执行try或者catch块时遇到return或者throw语句时,不会立即执行,而是去找是否有finally块,如果有,,系统立即开始执行finally块,只有当finally执行完成之后,系统才会跳回来执行try或catch语句里的return或throw语句,如果finally块里有return或throw语句等导致方法终止的语句,finally已经终止了方法,系统不会再跳回try或catch块执行代码。
tip:捕获异常catch块、先捕获小异常,在捕获大异常
示例一:
//下面是新建一个测试类的main方法
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");//读不存在的文件内容到输入流,系统创建文件不存在异常对象-抛出异常
} catch (FileNotFoundException e) {//找到匹配异常对象类型的catch块,将异常对象传给e-捕获异常
System.out.println(e.getMessage());//开始进行异常处理-打印异常的详细描述信息
e.printStackTrace();//输出异常的跟踪栈信息
// System.exit(0);// 先不说它
return ;//遇到人return先不执行,去找finally块
} catch (IOException ie) {
System.out.println(ie.getMessage());
}finally{//一定会被执行的代码块(并不一定),通常用来关闭物流资源-数据库连接、网络连接、磁盘文件io流
if(fis !=null){//判断输入流对象存在
try {
fis.close();//关闭输入流
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("执行finally块里的资源回收");
//finally块执行完回到catch块继续执行return语句
}
}
示例二:
public static void main(String[] args) {
boolean a = test();//所以返回结果是false
System.out.println(a);//false
}
//定义一个静态方法,static修饰为了main调用
public static boolean test(){
try {
// System.exit(0);//说finally并不一定执行是因为,如果运行这行代码,直接退出虚拟机,那么finally就不会执行了
return true;//遇到return去执行finally块
}finally{
return false;//有return直接方法结束,不会再跳转try执行return
}
}