JAVA异常处理

异常处理的执行顺序(针对try{}catch{}finally{}而言)

     对于try{}catch{}finally{}而言,,它们的执行顺序很简单,如果在try{}中捕获相应的异常,中断当前代码的执行,转而去执行catch{}中的内容,最后去执行

    finally{}中方法,一般来说finally中的方法都是会被执行的,其中finally中很大程度上用于资源的释放。

    下面讲解一些我们java程序员需要注意的地方。

          a、finally中的代码总是会执行吗?

             答:no,如果一个方法内在执行try{}语句之前就已经return了,那么finally语句指定不会执行了。因为它根本没有进入try语句中

                        如果在一个try语句中调用System.exit(0);方法,那么就会退出当前java虚拟机,那么finally也就没有执行的机会了。

          b、finally在return之前执行还是在return之后执行?

            答:很多人可能会说在return执行之前执行。我的答案是在return中间执行,是不是很特别,请按下面的例子:

复制代码
package com.yonyou.test;
class Test{
  public static void main(String[] args) {
      System.out.println(method());
     }
  public static int method(){
      int x=1;
      try{
         return x;
      }catch(Exception e)
      {
          return 0;
      }finally{
          ++x;
     }      
  }
 }
复制代码


请问输出的结果是多少呢?

    正确答案是:1

   下面我来讲解一下这个程序的执行过程,

    首先程序在执行到try{}语句中的return方法后,就会先返回相应的值,并把相应的值存储在一个临时栈中去保存这个结果。这时临时栈中存储的值为1。

    但是程序不会立刻返回,转而回去执行finally中的方法,++x,在finally执行完后,方法全部执行完,这时会再次调用return方法,注意这时

   不在是返回值,而是告诉主调程序,被调程序已经执行完了,你可以接着去执行你主程序的其它方法了。但是请注意,此时返回的值还是原来保存在临时

   栈中的值1。

 为了更好的理解这个问题,我们看下面的程序:

复制代码
package com.yonyou.test;
class Test{
  public static void main(String[] args) {
      System.out.println(method());
     }
  public static int method(){
      try{
          return 1;
      }catch(Exception e)
      {
          return 0;
      }finally{
          return 2;
      }
     }
   } 
复制代码

这时的正确答案又是多少呢?

     没错是2,这里仅仅需要注意的是在try{}语句中执行到return 1 会在临时栈中存储值为1的变量。接着回去执行finally里面的内容,这时执行finally中的return 2;方法,这时

    临时栈中的值就是变为 2,会覆盖原来临时栈中的值1.所以它的返回值为2。

  

     c、finally方法是必须的吗?

         不是,开发者可以根据自身的情况去决定是否使用finally关键字。

总结:在try中没有异常的情况下try、catch、finally的执行顺序 try --- finally
如果try中有异常,执行顺序是try --- catch --- finally
如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally --- return
如果try中有异常并且try中有return这时候正常执行顺序是try ---- catch  ---- finally --- return
如果在try和catch中没有执行System.exit();那么 finally 永远执行!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值