黑马程序员技术交流社区

标题: 关于try...catch语句,以及在try...catch中使用retrun语句 [打印本页]

作者: 247033993@qq.co    时间: 2014-5-23 23:09
标题: 关于try...catch语句,以及在try...catch中使用retrun语句
在论坛看到一个同学问到有关try...catch语句的相关问题,这个还是一个比较有趣的,原题如下
  1. public static void main(String[] args) {
  2.                 System.out.println(getInt());
  3.         }
  4.         private static int getInt() {
  5.                 int x = 10;
  6.                 try {
  7.                         x = 20;
  8.                         System.out.println(x / 0);
  9.                         x = 30;
  10.                 } catch (ArithmeticException e) {
  11.                         x = 40;
  12.                         return x;                 } finally {
  13.                         x = 50;
  14.                 }
  15.                 return x;
复制代码


他问结果是多少
这是一个try...catch有代表意义的题目,
这涉及到try...catch语句的执行顺序问题
  1.        
  2. try{
  3. //1:抛出异常的代码
  4. //2:代码
  5. }catch(){
  6. //3:代码
  7. //4:抛出异常
  8. }finally{
  9. //5:代码
  10. }
  11. //6:代码
复制代码
首先finally语句,是不管try是否抛出异常,finally语句块都会执行
其次,这个语句执行顺序会有几种情况:
第一种大的情况:try语句块没有抛出异常,则程序会执行try,finally以及finally块之后的代码;
第二种大的情况:try语句块抛出了异常并且catch有匹配的异常。当遇到try里面抛出的异常后,try块里面剩下的代码就不执行了,跳转到catch块里面。
这里又可以分为2种情况。第一种,抛出的异常被后面的catch捕获,而catch又没有抛出新的异常,那么执行顺序是1,3,5,6 ;第二种,如果catch里面又抛出新的异常,顺序是1,3,4,5,然后将新的异常返回给方法调用者,6就不执行了;
第三种大的情况:try语句块抛出了异常,但是后面的catch没有能匹配的异常。那么会执行try和finally里面的语句也就是1,5,然后将该异常返回给方法调用者,不执行6 。

那么实例中
  1. System.out.println(x / 0);
复制代码
这一句将抛出异常,并且被catch捕获,并且在执行到catch时候将x重新赋值,并返回。而此时又涉及到在try..catch中使用return语句
如果在try语句中有return语句时,finally语句是在return语句前执行的,而且finally语句不能改变return的返回值,finally语句中不应含有return语句
所以分析之后,结果应该是40 个人理解,不当之处,请各位大神赐教

作者: 远行的人2号    时间: 2014-5-24 02:09
讲解地很好哦!
作者: Ф福@ 御    时间: 2014-5-24 10:47
给力,讲解的不错




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2