`
IXHONG
  • 浏览: 439383 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转载】try-catch

    博客分类:
  • Java
阅读更多

本文转载自http://shift-alt-ctrl.iteye.com/blog/2156937

 

有时候一些小的细节,确实比较纠结,对于try-catch-finally代码块中代码依次执行,当try中有exception抛出时,将会有catch拦截并执行,如果没有catch区块,那么exception将被添加到“return栈顶”并执行finally。

    1) 如果catch中,再次抛出exception,那么原try中的exception是否还能抛出呢?

    2) 如果catch中,抛出异常,finally是否继续执行?

    3) 如果finally抛出异常,那么catch中抛出的异常,还能被外部捕获到吗?

    4) 如果catch中,再次抛出异常,那么在finally中使用“return”,外部还能捕获异常吗?

 

    中断方法调用的手段有“异常中断”和“return返回”,那么我们可以简单的认为throw异常也是导致方法调用终止的信号,它和return的作用是一样的。

 

   答案1),其实这么说可能不妥,既然catch了,原异常就没有意义了。但是如果没有catch代码块,try中的异常仍会被抛出。

 

    答案2),finaly无论如何,总会执行,即使在try-catch中使用了“return”;但是,如果在catch和finaly中,都使用了“return”,那么最终是哪个return值时有意义的?

Java代码  收藏代码
  1. public static int test2() {  
  2.         try{  
  3.             System.out.println("try");  
  4.             throw  new RuntimeException("try");  
  5.         } catch (Exception e) {  
  6.             System.out.println("catch");  
  7.             return 1;  
  8.         } finally {  
  9.             System.out.println("finally");  
  10.             return 2;  
  11.         }  
  12. }  

  如上述代码,那么最终返回的是“1”还是“2”?答案是2。

 

    答案3),因为java中“exception栈”只能保存最后一条,因此最后抛出的异常将会替换原来的异常,因此如果finally中抛出异常,那么catch中的再次抛出的异常将被“擦除”(逃逸)。

 

    答案4),“return”和“exception”都被认为是“方法中断”操作,最后发生者将会生效;当catch中再次抛出异常,原目的是将此异常抛给调用者,结果在finally中使用return(我们认为此处使用return是不当的),那么异常将会被擦除,“return”正常返回。为了避免这种问题,我们可以这么做:

Java代码  收藏代码
  1. Throwable ex = null;  
  2. try{  
  3.     System.out.println("try");  
  4.     throw  new RuntimeException("try");  
  5. catch (Exception e) {  
  6.     ex = e;  
  7. finally {  
  8.     System.out.println("finally");  
  9.     if(ex != null) {  
  10.         throw new RuntimeException(ex);  
  11.     }  
  12.     return 2;  
  13. }  

 

分享到:
评论

相关推荐

    打败所有黑客的加密算法

    【欢迎转载或翻译该文】 现在上网,难免会涉及一些需要保密的内容,比如密码,账号,卡号,证件号等。但是黑客无处不在,他们常常窃听你的信息,给你放置陷阱,让你的防不胜防。 比如我现在要将信息“账号:123456...

    解决struts2下载异常的jar包 struts2-sunspoter-stream-1.0.jar

    还有一种办法是在页面进行try..catch,之后什么都不做 异常原因分析: stream对应的类是org.apache.struts2.dispatcher.StreamResult,该类的处理过程如下: 1。配置其中result标签下的各个参数 2。从服务器...

    springmybatis

    }catch(Exception e){ e.printStackTrace(); } } public static SqlSessionFactory getSession(){ return sqlSessionFactory; } public static void main(String[] args) { SqlSession session = ...

    AJAX应用的通用流程

    3. AJAX应用的通用流程 3.1 创建request对象 有了上面的基础知识后,我们来看看一些具体的例子。...本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newsainton/archive/2009/07/23/4374714.aspx

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    10.2.1 在try-catch语句中处理异常 343 10.2.2 使用requestdispatcher来处理异常 346 10.3 小结 349 第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量...

    js使用小技巧

    Javascript小技巧一箩筐 事件源对象 event.srcElement.tagName event.srcElement.type ... 捕获释放 event.srcElement.setCapture();...event.srcElement.releaseCapture();... 根据鼠标获得元素: document....

    javasnmp源码-note:java学习笔记

    java snmp 源码 *********************************************************************************************** 这是本人跟着马士兵老师学习Java...异常的5个关键字:try``catch``finally``throw``throws ###概念

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    10.2.1 在try-catch语句中处理异常 343 10.2.2 使用requestdispatcher来处理异常 346 10.3 小结 349 第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    10.2.1 在try-catch语句中处理异常 343 10.2.2 使用requestdispatcher来处理异常 346 10.3 小结 349 第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    10.2.1 在try-catch语句中处理异常 343 10.2.2 使用requestdispatcher来处理异常 346 10.3 小结 349 第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量...

    asp.net知识库

    消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 ...

    jdbc连接数据库的方式2

    三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能(系转载)。  1、在客户端软件开发中使用Thin驱动程序  在开发Java软件方面,Oracle...

    java设计模式CatalogDAOFactory是典型的工厂方法

     //动态转载类  Class c = Class.forName(className);  factory = (ForumFactory)c.newInstance();  }  catch (Exception e) {  return null;  }  }  }  }  //Now, 返回 proxy.用来限制授权对forum的...

    二十三种设计模式【PDF版】

    主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...

Global site tag (gtag.js) - Google Analytics