1.在finally块中,关闭资源 public class Test{ public static void main(String[]args){ FileInputStream fis=null; FileOutputStream fos=null; ...... try{ //do something... }finally{ //有危险的关闭方式1 fis.close(); fos.close(); //有危险的关闭方式2 if(fis!=null){ fis.close; } if(fos!=null){ fos.close(); } //推荐的方式 if(fis!=null){ try{ fis.close(); }catch(Exception){ e.printStackTrace(); } } if(fos!=null){ try{ fos.close(); }catch(Exception){ e.printStackTrace(); } } } } } 2.finally块的陷阱 public class Test{ public static void main(String[]args){ FileOutputStream fos=null; try{ // do something... System.out.println("打开资源"); System.exit(0); }finally{ if(fos!=null){ try{ fos.close(); }catch(Exception){ e.printStackTrace(); } } System.out.println("关闭资源"); } } } 解释:这个程序"关闭资源"不会输出,因为try块中的System.exit(0);将当前线程停止了,而finally块不能执行已经停止的线程. 若非要输出“关闭资源”,且执行System.exit(0);则修改如下: public class Test { public static void main(String[] args) throws Exception { final FileOutputStream fos; fos = new FileOutputStream("a.bin"); System.out.println("打开物理资源"); //为系统注册关闭钩子 Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { if (fos != null) { try { fos.close(); } catch (Exception e) { e.printStackTrace(); } } System.out.println("程序关闭了资源"); } }); System.out.println("退出程序"); System.exit(0); } } 3.finally块和方法返回值 public class Test { public static void main(String[] args) { int a = test(); System.out.println(a); } private static int test() { int count = 5; try { System.out.println("try"); return count + 2; // 不执行 } finally { System.out.println("finally"); return -1; // 执行 } } } 解释:当在try块中有return 语句的时候,且有finlly的时候,不会立马执行try块中的return ,而是执行finally中的程序。 若finally块中也有return 语句,则执行finally中的reutrn 语句,然后程序结束,不会执行try块中的return public class Test { public static void main(String[] args) { int a = test(); System.out.println(a); } private static int test() { int count = 5; try { throw new RuntimeException("测试异常"); //不执行 } finally { System.out.println("finally"); return count; } } } 解释:当在try块中抛出异常时候,若finally块中有 return语句,则程序不会真正抛出异常,而是直接执行完finally块后,返回return语句。
相关推荐
能够让系统在出现异常的情况下恢复过来的程序使用异常处理情况:异常诊断与异常处理不在同一个位置下时使用异常处理程序(若用户一直通过键盘与程序通话,那么就不能使用处理键盘输入处理)使用异常的注意事项:<BR>...
27.8 APM的注意事项 27.8.1 在没有线程池的前提下使用APM 27.8.2 总是调用EndXxx方法,而且只调用一次 27.8.3 调用EndXxx方法时总是使用相同的对象 27.8.4 为BeginXxx和EndXxx方法使用ref,out和params实参 ...
Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要自定义类加载器 如何自定义类加载器 什么是GC 内存泄漏和内存溢出 Java的内存模型(JVM的内存划分) ...
· 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态扩展能力的应用程序 本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以...
· 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态扩展能力的应用程序 本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以...
· 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态扩展能力的应用程序 本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以...
60分钟) 217 11.1 异常处理基本介绍 217 11.1.1 try和catch捕获异常 217 11.1.2 try-catch语句使用注意点 218 11.1.3 finally语句的使用 220 11.1.4 再谈异常处理注意点 222 11.2 异常的分类 223 11.2.1 捕获异常 ...
5.6.5 结构化异常处理(try-finally块) 5.6.6 使用宏需要注意的地方 5.6.7 断言 5.7 小结 第6章 Windows内核函数 本章介绍了Windows内核模式下的一些常用内核函数,这些函数在驱动程序的开发中将会...
5.6.5 结构化异常处理(try-finally块) 5.6.6 使用宏需要注意的地方 5.6.7 断言 5.7 小结 第6章 Windows内核函数 本章介绍了Windows内核模式下的一些常用内核函数,这些函数在驱动程序的开发中将会...
• sample30.htm 抛出不同的异常(多catch语句块) • sample31.htm finally语句 • sample32.htm 空语句 • sample33.htm return语句 第8章(\代码\第08章) • sample01....