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,而关闭文件时候又出错,那么会覆盖之前的信息而只看到后面的吗?
其实我的问题概括起来就是这个问题怎么写最合理,出错时候的运行机理是怎样的?请大家指点一下

解决方案 »

  1.   

    我觉得比较合理的就是把finally里面的东西全部去掉
    只留下几个close()方法
    然后try里面的close()方法不要首先你要明白finally是为了干什么的
    假如你预期finally还要抛错,你为什么不再前面就把它解决?一般来说finally是为了释放资源(当然也可以干很多其他的收尾工作),无论有没有异常你的finally里面去catch这些异常没有意义,以为前面都已经catch掉了
    编译器应该会提示你的这种东西可以照着书抄一遍
    然后仔细想想就明白了