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

下面是简单的抛异常处理

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

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

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

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

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

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

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

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

(java)从零开始之--异常处理(以文件拷贝为例)的更多相关文章

  1. Java学习-045-目录中文件拷贝

    挺晚的了,直接上码.敬请各位小主参阅,若有不足之处,敬请指正,非常感谢! 目录文件拷贝源码: /** * <strong>目录拷贝</strong><br> * & ...

  2. Java通过NIO实现快速文件拷贝的代码

    将内容过程重要的内容片段做个记录,下面的内容段是关于Java通过NIO实现快速文件拷贝的内容. public static void fileCopy( File in, File out ) thr ...

  3. Java IO和Java NIO 和通道 在文件拷贝上的性能差异分析

    1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...

  4. 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  5. Java IO和Java NIO在文件拷贝上的性能差异分析

    1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...

  6. java对文件拷贝的简单操作

    package fileInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  7. Java实现文件拷贝的4种方法.

    原文地址:http://blog.csdn.net/ta8210/article/details/2073817 使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢? 最近看了看N ...

  8. Java基础IO文件拷贝练习题

    /** * 编写一个程序,把指定目录下的所有的带.java文件都拷贝到另一个目录中,拷贝成功后,把后缀名是.java的改成.txt. */ 1.我们看到这个题还是用大化小的思想来做 分析:1.拷贝 & ...

  9. Java IO编程——文件拷贝

    在操作系统里面有一个copy命令,这个命令的主要功能是可以实现文件的拷贝处理,现在要求模拟这个命令,通过初始化参数输入拷贝的源文件路径与拷贝的目标路径实现文件的拷贝处理. 需求分析: ·需要实现文件的 ...

随机推荐

  1. WordPress wp-admin/includes/post.php脚本安全漏洞

    漏洞名称: WordPress wp-admin/includes/post.php脚本安全漏洞 CNNVD编号: CNNVD-201309-168 发布时间: 2013-09-13 更新时间: 20 ...

  2. C#调用Web Service时的身份验证

    原理:webservice所在的系统中,在系统域中建立用于登录的软件的用户和密码,软件登录时将用户名.密码和登录的本机的域的名字通过webService的NetworkCredential传递到web ...

  3. Delphi 用Web App Debugger简单调试ISAPI 转

    用Web App Debugger简单调试ISAPI   以isapi为例: 1.新建一个project,用isapi/nsapi: 2.remove这个project中所有的unit: 3.加进你用 ...

  4. RC滤波器

    1.一阶RC低通滤波器 RC低通滤波器的电路及其幅频.相频特性如下图所示,输入电压为ex,输出电压为ey 其中ζ=RC,截止频率f=1/2πRC. 2.一阶RC高通滤波器 其中ζ=RC,截止频率f=1 ...

  5. HDOJ(HDU) 2519 新生晚会(组合公式)

    Problem Description 开学了,杭电又迎来了好多新生.ACMer想为新生准备一个节目.来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法? I ...

  6. HashMap和Hashtable

    HashTable 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的  速 ...

  7. reloadData should be in main thread

    reloadData should be called in main thread, so if you call it in work thread, you should call it as ...

  8. Properties/Property文件读取(键值均)乱码问题!

    方法一:使用native2ascii进行转码,这个不做说明,客户不可能帮你转码的. 方法二:当键是因为时直接getProperty即可,但加载后的propertis对象里的键也是中文乱码,就无法通过g ...

  9. BJUI 转

    B-JUI 前端框架B-JUI(Bootstrap for DWZ)是一个富客户端框架,基于DWZ-jUI富客户端框架修改. 本文是B-JUI中文使用手册,包括使用示例代码,感兴趣的同学参考下. 概览 ...

  10. HIVE自定义函数 UDF

    自定义my_md5hash 具体hive源码怎么调用看我另外一篇博客 package udf.hive.myudf; import org.apache.commons.codec.digest.Di ...