开发过程中避免不了对异常的处理,但是异常的处理又不能乱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. Error: opening registry key 'Software\JavaSoft\Java Runtime Environment' Error: could not find java.dll

    java -jar yxCollector-1.1.0.jarError: opening registry key 'Software\JavaSoft\Java Runtime Environme ...

  2. 深入浅出Node.js (9) - 玩转进程

    9.1 服务模型的变迁 9.1.1 石器时代:同步 9.1.2 青铜时代:复制进程 9.1.3 白银时代:多线程 9.1.4 黄金时代:事件驱动 9.2 多进程架构 9.2.1 创建子进程 9.2.2 ...

  3. 介绍4款json的java类库 及 其性能测试

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...

  4. Distinct Subsequences——Leetcode

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  5. Unity 打包完太大

    打包完以后,看BuildLog,发现 Level 这一项数据很大,按照官方文档,这应该是很小的一项才对,但是我们的包中Level占据了80+M,20-30%,经过反复试验,发现是 Static Bat ...

  6. IOS性能调优系列:Analyze静态分析

    目前关于IOS性能优化的教程较少,决定写一个<IOS性能调优系列>,主要关注与内存泄漏.性能优化.流量和电量分析几个方面. XCode已经提供了非常强大的性能调优工具,结合几个第三方工具和 ...

  7. iPhone之Quartz 2D系列--编程指南(1)概览

    以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 iPhone之Quartz ...

  8. return的用处

    #include "stdio.h" main() { ,c=; ;a<;a++) { c=c+a; } printf("%d",c); return ; ...

  9. java 微信公众服务平台 下发 模板消息

    java 微信公众服务平台 下发 模板消息 (一).部分截图 (二).部分代码 (一).部分截图: (二).部分代码: //此处 给用户微信发消息... Map<String,String> ...

  10. Spark1.0.0 监测方法

          Spark1.0.0能够通过下面几种方式来对Spark应用程序进行监控: Spark应用程序的WebUI或者Spark Standalone的集群监控 指标,然后通过支持指标收集的集群监控 ...