zoukankan      html  css  js  c++  java
  • (java)从零开始之--异常处理(以文件拷贝为例)

    开发过程中避免不了对异常的处理,但是异常的处理又不能乱throw

    下面是简单的抛异常处理

     1 public static void CopyFile(String souFile,String dirFile){
     2         FileInputStream inputStream = null;
     3         FileOutputStream outputStream = null;
     4         try{
     5             //找到目标文件
     6             File sou = new File(souFile);
     7             File dir = new File(dirFile);
     8             //建立文件的输入输出流
     9             inputStream = new FileInputStream(sou);
    10             outputStream = new FileOutputStream(dir);
    11             //每次读和写的款冲数组
    12             byte[] buf = new byte[1024];
    13             int len = 0;
    14             //边读编写
    15             while((len = inputStream.read(buf))!= -1){
    16                 outputStream.write(buf,0,len);
    17             }
    18         }catch(IOException e){
    19             //为了给调用者方便,所以就不直接抛出IOException,而是抛出一个运行时异常RuntimeException,
    20             //而必须将e作为参数传递进去,这样当异常发生,调用者也能知道具体的异常信息。否则异常获取到的
    21             //RuntimeException并不是调用者想要的信息。
    22             throw new RuntimeException(e);
    23         }finally{
    24             try{
    25                 //释放资源:后建立的资源先释放
    26                 outputStream.close();
    27                 inputStream.close();
    28             }catch(IOException e){
    29                 throw new RuntimeException(e);
    30             }
    31         }
    32         
    33     }
    34     

    这样看似处理的还可以,但是还是有一点不完美,为什么?当文件路径传入不正确,或者说文件不存在的时候,最后的结果是

     Exception in thread "main" java.lang.NullPointerException
      at FileStream.Demo1.CopyFile(Demo1.java:42)
      at FileStream.Demo1.main(Demo1.java:14)

    没错,就是空指针异常,当调用者的文件路径传入不正确的时候,上面代码26 或 27行就会抛出空指针异常,对于一个文件拷贝操作,这样的异常是不应该抛给调用者的,所以,在这两行代码中加上非空判断,这段代码也算做的完整了,如下:

     1 public static void CopyFile(String souFile,String dirFile){
     2         FileInputStream inputStream = null;
     3         FileOutputStream outputStream = null;
     4         try{
     5             //找到目标文件
     6             File sou = new File(souFile);
     7             File dir = new File(dirFile);
     8             //建立文件的输入输出流
     9             inputStream = new FileInputStream(sou);
    10             outputStream = new FileOutputStream(dir);
    11             //每次读和写的款冲数组
    12             byte[] buf = new byte[1024];
    13             int len = 0;
    14             //边读编写
    15             while((len = inputStream.read(buf))!= -1){
    16                 outputStream.write(buf,0,len);
    17             }
    18         }catch(IOException e){
    19             //为了给调用者方便,所以就不直接抛出IOException,而是抛出一个运行时异常RuntimeException,
    20             //而必须将e作为参数传递进去,这样当异常发生,调用者也能知道具体的异常信息。否则异常获取到的
    21             //RuntimeException并不是调用者想要的信息。
    22             throw new RuntimeException(e);
    23         }finally{
    24             try{
    25                 //释放资源:后建立的资源先释放
    26                 if(outputStream != null){ //这一步处理是当文件路径不正确时,outputStream为null,运行到此就会抛出一个空指针异常
    27                     outputStream.close();
    28                 }
    29                 if(inputStream !=null){
    30                     inputStream.close();
    31                 }
    32             }catch(IOException e){
    33                 throw new RuntimeException(e);
    34             }
    35         }
    36         
    37     }

    这样子再一次随便传入一个不存在的路径执行,得到的结果如下:

    Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: F:a.jpg (系统找不到指定的文件。)
      at FileStream.Demo1.CopyFile(Demo1.java:38)
      at FileStream.Demo1.main(Demo1.java:14)
    Caused by: java.io.FileNotFoundException: F:a.jpg (系统找不到指定的文件。)
      at java.io.FileInputStream.open(Native Method)
      at java.io.FileInputStream.<init>(FileInputStream.java:138)
      at FileStream.Demo1.CopyFile(Demo1.java:25)
      ... 1 more

    这样即是我们想要得到的信息,一目了然...找不到文件...

  • 相关阅读:
    关于linux下如何使用svn 客户端
    vscode 如何格式化vue(template)html代码 , 保持标签属性不换行
    echarts的一些基础笔记
    Stompjs websocket vue
    GLSL反转矩阵inverse
    【入门向】使用 MetaHook Plus 绘制 HUD
    取文件MD5 WINAPI
    BAD APPLE C++控制台程序
    查看struct或class的内存布局
    让游戏以高性能GPU(独立显卡)运行
  • 原文地址:https://www.cnblogs.com/fnz0/p/5388920.html
Copyright © 2011-2022 走看看