A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在论坛看到一个同学问到有关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 个人理解,不当之处,请各位大神赐教

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

2 个回复

倒序浏览
讲解地很好哦!
回复 使用道具 举报
给力,讲解的不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马