本帖最后由 Neverbelazy 于 2013-4-28 14:45 编辑
java调用OS资源是需要程序手动关闭的。在毕老师的视频第18天中,IO流完成文件的复制时要在finally中分别关闭FileWriter和FileReader流对象(此处定义为fw,fr)。
其中提到,不可以在一个try-catch模块中同时关闭两个,例如:- try{
- fw.close();
- fr.close();
- }catch(IOException e){ //定义的异常产生提示或解决语句}
复制代码 这是因为如果fw.close()产生了异常,fr.close()就执行不到了,相当于没有关闭读取流fr的资源。
毕老师给出的解决办法是分开 来两个try-catch 块- try{
- fw.close();
- }catch(IOException e){ //定义的异常产生提示或解决语}
- try{
- fr.close();
- }catch(IOException e){ //定义的异常产生提示或解决语}
复制代码 但是这似乎还是有问题的:比如说,如果我们将上面代码的两个catch(){}内的解决办法定义为 throw new RuntimeException(); 同样会存在造成 fr 资源没有关闭的隐患。
毕老师的视频中还提到一种解决try-catch-finally{try-catch}嵌套的解决办法,如果是样,就可以安全的关闭资源了。- try{
- fw.close();
- }catch(IOException e){ throw new RuntimeException();}
- finally{
- try{
- fr.close();
- }catch(IOException e){throw new RuntimeException();}
- }
复制代码 这是我的一些看法,请指正。
-------------------------------------分割线------------------------
Q:我不太确定了 throw RuntimeExcetpion()后 JVM是将程序直接 停止了 还是 仍会 执行下面的代码? 请高手解答!
5.27PM更新编辑
A:已经解决: throw RuntimeException()后 程序停止,不会在执行之后的代码,但是会执行finally的代码! 所以 try-catch-finally(try-catch)模式的资源关闭是三者中最健壮的。
- public class RuntimeExceptionTest {
- public static void main(String[] args){
- try{
- System.out.println(5/0);
- }catch(Exception e){
- System.out.println("之前的代码");
- throw new RuntimeException("catch...");
- }
- finally{
- System.out.println("final的代码");
- }
- System.out.println("之后的代码");
- }
-
- }
复制代码 |