

finally一定会执行,执行try内部代码块时,到了return会被拽回来因为finally还没有被执行 返回结果为100
所以不建议在finally代码块中加return,加了的话,返回的永远时这里的数据,这样会出问题
System.exit(0) 会把JVM虚拟机干掉,finally不会被执行
使用:在finally代码块里面写完,要做非空校验,避免空指针异常

package com.itheima.d5_resource;import java.io.*;/*** 目标: 释放资源*/public class TryCatchFinallyDemo1 {public static void main(String[] args) {// 将输出流和输入流定义到外面去(main方法下面) 定义为null 代表输入管道和输出管道没有被指向任何对象InputStream is = null;OutputStream os = null;// 1. 创建一个字节输入流管道与原视频接通 输入流 输入从硬盘到内存// 这是是外层可以用try/catchtry {is = new FileInputStream("C:\\Users\\aufs\\Desktop\\是心之所向 - 抖音.mp4");// 2.创建一个字节输出流管道与目标文件接通 输出: 将内存输出到硬盘(保存的感觉)os = new FileOutputStream("C:\\Users\\aufs\\Pictures\\Saved Pictures\\newMp4.mp4");// 3. 定义一个字节数组转移数据byte[] buffer = new byte[1024]; // 1024B(字节) = 1kBint len; // 记录每次读取的数据 因为最后一桶水可能装不满 主要是记录最后一桶水读取了多少while ((len = is.read(buffer)) != -1){ // 当读取不到时 会返回 -1 如果不等于-1,则执行下面代码System.out.println("读取了 " + len);os.write(buffer,0,len); // 有多少读多少}System.out.println("复制完成 ");// 这个收尾的操作要定义在finally里面// // 4. 关闭值 从内往外关// os.close();// is.close();// System.out.println(10 / 0);} catch (Exception e) {e.printStackTrace();} finally {// 无论代码是正常结束,还是出现异常都要最后执行这里System.out.println("============finally=============");// 4. 关闭值 从内往外关try {// 4. 关闭流 关闭之前做非空校验 避免空指针异常 不等于空才关闭流if (os!=null)os.close();} catch (IOException e) {e.printStackTrace();}try {if (is!=null)is.close();} catch (IOException e) {e.printStackTrace();}}}}
