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

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