(java)从零开始之--异常处理(以文件拷贝为例)
开发过程中避免不了对异常的处理,但是异常的处理又不能乱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)从零开始之--异常处理(以文件拷贝为例)的更多相关文章
- Java学习-045-目录中文件拷贝
挺晚的了,直接上码.敬请各位小主参阅,若有不足之处,敬请指正,非常感谢! 目录文件拷贝源码: /** * <strong>目录拷贝</strong><br> * & ...
- Java通过NIO实现快速文件拷贝的代码
将内容过程重要的内容片段做个记录,下面的内容段是关于Java通过NIO实现快速文件拷贝的内容. public static void fileCopy( File in, File out ) thr ...
- Java IO和Java NIO 和通道 在文件拷贝上的性能差异分析
1. 在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...
- 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇
本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...
- Java IO和Java NIO在文件拷贝上的性能差异分析
1. 在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...
- java对文件拷贝的简单操作
package fileInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...
- Java实现文件拷贝的4种方法.
原文地址:http://blog.csdn.net/ta8210/article/details/2073817 使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢? 最近看了看N ...
- Java基础IO文件拷贝练习题
/** * 编写一个程序,把指定目录下的所有的带.java文件都拷贝到另一个目录中,拷贝成功后,把后缀名是.java的改成.txt. */ 1.我们看到这个题还是用大化小的思想来做 分析:1.拷贝 & ...
- Java IO编程——文件拷贝
在操作系统里面有一个copy命令,这个命令的主要功能是可以实现文件的拷贝处理,现在要求模拟这个命令,通过初始化参数输入拷贝的源文件路径与拷贝的目标路径实现文件的拷贝处理. 需求分析: ·需要实现文件的 ...
随机推荐
- (转载)mysql_query( )返回值
(转载)http://hi.baidu.com/tfbzccqceabfhyd/item/bd01db9f8995204af04215e4 调用mysql_query( ),当查询操作是update. ...
- 【转】unity3d 如何得到当前物体播放的动画
原文:http://blog.csdn.net/smilelance/article/details/22285125 public static string GetCurrentPlayingAn ...
- Render To Texel Baker
今天仔细研究了 Shaowgun 示例中那个金黄色雕像所使用的光照纹理烘焙工具:“Render To Texel Baker”.因为要在移动设备展现比较逼真的光照效果,但是实时使用法线贴图并大量用于场 ...
- 局域网内通过UDP协议进行传输接受数据——AsyncUdpSocket
在相同的局域网内,可以通过Udp协议进行数据的传输和接收,Udp协议与Http协议不同,Udp更加方便快捷,省去了很多步骤,但是也有很多传输问题,在局域网内小范围传输数据时Udp还是非常能够胜任的. ...
- 如何以非 root 用户将应用绑定到 80 端口-ssh 篇 » 社区 » Ruby China
如何以非 root 用户将应用绑定到 80 端口-ssh 篇 » 社区 » Ruby China 如何以非 root 用户将应用绑定到 80 端口-ssh 篇
- 让nginx支持文件上传的几种模式
文件上传的几种不同语言和不同方法的总结. 第一种模式 : PHP 语言来处理 这个模式比较简单, 用的人也是最多的, 类似的还有用 .net 来实现, jsp来实现, 都是处理表单.只有语言的差别, ...
- Java GC 专家系列3:GC调优实践
本篇是”GC专家系列“的第三篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种G ...
- Qt 智能指针学习(7种指针)
Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...
- WebLogic SSRF 漏洞 (简要翻译)
[Ref]http://blog.gdssecurity.com/labs/2015/3/30/weblogic-ssrf-and-xss-cve-2014-4241-cve-2014-4210-cv ...
- 【Android - V】之DrawerLayout的使用
DrawerLayout是Android V4包中的一个布局控件,用来实现一个抽屉样式的布局. DrawerLayout通过设置子视图的layout_gravity来决定子视图停靠在屏幕的哪个边缘外侧 ...