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/catch
try {
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(字节) = 1kB
int 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();
}
}
}
}