日期:2014-05-20  浏览次数:20744 次

请教一个错误捕捉的问题
public   static   void   CopyFile(File   in,   File   out)   {
FileInputStream   fis   =   null;
FileOutputStream   fos   =   null;
try   {
fis   =   new   FileInputStream(in);
fos   =   new   FileOutputStream(out);
byte[]   buf   =   new   byte[1024];
int   i   =   0;
while   ((i   =   fis.read(buf))   !=   -1)   {
fos.write(buf,   0,   i);
}
//这是第一部分:
fis.close();
fos.close();
}   catch   (FileNotFoundException   e)   {
e.printStackTrace();
}   catch   (IOException   e)   {
e.printStackTrace();
}   finally   {//finally这儿是第二部分
if(fis   !=   null){
try   {
fis.close();
fis   =   null;
}   catch   (IOException   e)   {
        e.printStackTrace();
}
}
if(fos   !=   null){
try   {
fos.close();
fos   =   null;
}   catch   (IOException   e)   {
        e.printStackTrace();
}
}
}
}

问题1:我用第一部分的写法,Jtest时候会出错,说没有关闭,这样写不严谨对吗?
问题2:用第二部分的写法,那么我假设try部分不出错,而在finally部分关闭fis出错,那么执行e.printStackTrace();下面fos的关闭就不会执行了对吧,那么fos就无法关闭了对吗?
问题3:用第二部分的写法,我假设while循环里面运行到一半出错,那么首先抛出上面的IO错误,然后执行finally,而关闭文件时候又出错,那么会覆盖之前的信息而只看到后面的吗?
其实我的问题概括起来就是这个问题怎么写最合理,出错时候的运行机理是怎样的?请大家指点一下




------解决方案--------------------
我觉得比较合理的就是把finally里面的东西全部去掉
只留下几个close()方法
然后try里面的close()方法不要

首先你要明白finally是为了干什么的
假如你预期finally还要抛错,你为什么不再前面就把它解决?

一般来说finally是为了释放资源(当然也可以干很多其他的收尾工作),无论有没有异常

你的finally里面去catch这些异常没有意义,以为前面都已经catch掉了
编译器应该会提示你的

这种东西可以照着书抄一遍
然后仔细想想就明白了