开发过程中避免不了对异常的处理,但是异常的处理又不能乱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. 【HDOJ】1686 Oulipo

    kmp算法. #include <cstdio> #include <cstring> ], des[]; ], total; void kmp(char des[], cha ...

  2. bzoj1391

    很像最大权闭合子图的题目s向每个工作连边,流量为收益每个工序,由工作i向对应机器连边,流量为租用费每个机器向t连边,流量为购买费显然跑最小割,ans=总收益-mincut ; type node=re ...

  3. JAVA中IO技术:BIO、NIO、AIO

    1.同步异步.阻塞非阻塞概念        同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...

  4. activity+fragment多次切换出现页面空白问题

    刚上手一个项目 懒的用viewpager+fragment模式,尽管在后面的项目中还是用到viewpager+fragment.先说说问题,多次切换fragment的时候页面出现空白,刚开始以为传递的 ...

  5. C# 日期格式化的中的 正斜杠的问题

    Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd" )); //这行代码, 如果你在系统日期格式默认的情况下输出 2013/0 ...

  6. 导入 from pdfminer.pdfinterp import process_pdf 错误

    >>> from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter>>> from ...

  7. Linux学习笔记7——linux中的静态库和动态库

    一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用a ...

  8. HDOJ/HDU 2710 Max Factor(素数快速筛选~)

    Problem Description To improve the organization of his farm, Farmer John labels each of his N (1 < ...

  9. (转载)关于having 1=1 和group by 爆表的思考和总结

    上次在网上看到一篇关于having 1=1 和group by 爆表注射的文章,看得我晕乎乎的,为了了解其根本原理,我稍微学习了下数据库知识,翻了下资料,但有些资料找不到,于是,开始发挥本天才的思维来 ...

  10. 错误137(net::ERR_NAME_RESOLUTION_FAILED):未知错误的解决办法

    现象:之前遇到一些新闻网站打不开的情况...而让异地的朋友打开却能打开.. 解决①:配置dns ,因为公司内部的网络是桥接的 我们dns服务器默认是192.168.1.1 ,dns被封锁,直接导致一些 ...