开发过程中避免不了对异常的处理,但是异常的处理又不能乱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. Ubuntu系统下为IDEA创建启动图标

    默认情况下,ubuntu将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,需要在该目录下创建一个名为“idea.desktop”的文件. ...

  2. BZOJ1015 [JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3895  Solved: 1750[Submit ...

  3. ACM2096_小明A+B

    #include<iostream> int main() { using namespace std; int a,b,count; cin>>count; while(co ...

  4. ACM1877_又一版A+B

    .这道题与2031极为相似. #include<iostream> using namespace std; void fun(int n,int r) { ]="0123456 ...

  5. Codeforces 350B Resort

    题目链接:http://codeforces.com/problemset/problem/350/B 一开始想复杂了,建了张图,结果效率太低T了.其实用数组存可以了,结果发现的时候快没时间了,修改好 ...

  6. 杭电 1795 The least one

    The least one Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. angularjs post 跨域

    web api搞好了:用Ajax妥妥的:但是前端用的AngulagJS,也懒得再换为Ajax了: 但是问题来了:提示: 已拦截跨源请求:同源策略禁止读取位于 http://x.x.x.x:port/a ...

  8. Linq to sql语法

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...

  9. c#委托和事件(下) 分类: C# 2015-03-09 08:42 211人阅读 评论(0) 收藏

    C#中的委托和事件(下) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为 ...

  10. 手把手教你在ubuntu下创建桌面快捷方式

    习惯使用windows的朋友来说创建桌面快捷方式简直就是so easy, 鼠标右键点击文件-->选择发送桌面快捷方式.就OK了.对于ubuntu下该如何创建桌面快捷方式呢?以下以创建eclips ...