public static void main(String[] args) { try { System.out.println("00000"); }catch (Exception e){ }finally { try { System.out.println("1111"); throw new RuntimeException(); }catch (Exception e){ System.out.println("error111"); e.printStackTrace(); } try { System.out.println("22222"); }catch (Exception e){ System.out.println("error2222"); } } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
打印
00000java.lang.RuntimeException1111 at Client.main(Client.java:63)error111 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)22222 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
可以看出打印的顺序为
0000
1111
error111
22222
那么就可以知道在finally之中即使抛出异常也会继续执行下去
所以在关闭流的时候
正确的用法是
try{if(is != null){ is.close();}}catch(Exception e){ logger.error("关闭输入流错误!", e);}try{if(os != null){ os.close();}}catch(Exception e){ logger.error("关闭输出流错误!", e);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
错误的写法是这样的
try{ is.close(); os.close();}catch(Exception e){ logger.error("关闭流错误!", e);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
因为is关闭错误的时候 os就不会正确关闭,那么内存泄露 流未关闭,会导致文件正在使用中。。。。其它流并不能操作。。。
也可以使用jdk1.7的新特性
try with resources
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow
本文详细解析了Java中异常处理的流程,特别是finally块中异常的处理方式及其执行顺序。通过实例演示了即使在finally块中抛出异常,后续代码仍会执行的特点。并强调了在关闭资源如流时,应分别处理每个资源的关闭异常,避免因一处错误导致其他资源无法正确关闭。同时介绍了JDK1.7引入的try-with-resources语句简化资源管理。
1055

被折叠的 条评论
为什么被折叠?



