java中的异常以及 try catch finally以及finally的执行顺序

原创 2015年11月19日 11:28:49
 

java中的异常以及 try catch finally以及finally的执行顺序


2、为什么要用finally
先看一个没有finally的异常处理try-catch语句:
假设count为要使用到的资源,并且用完要求释放此资源。那么我们可以把释放资源的语句放到try-catch后执行,当前的程序不管是在执行完try语句块还是catch语句块,都会顺序执行到下面释放资源的语句。
int count = 0;  //初始化资源
try{
  count++;
  if(count == 1) throw new Exception("Exception in try");
}catch(Exception e){
  System.out.println("catch block");
}
count = 0; //释放资源

但是,如果在try或catch中有多条return语句,那么在每条return语句之前,都要先执行释放资源的语句:
public void f() throws Exception {
 int count = 0;  //初始化资源
 try{
   doSomething;
   statementMayCauseException;  

//可能会抛出异常的语句,若异常没有被catch,则直接抛出,也不会执行到try-catch下面的语句,因为这个异常被系统处理就是打印了异常栈的信息之后就结束了这个程序,也就是结束了这个进程。
   doSomething;
   if(count == 1) throw new Exception1("E1 in try");
   if(count == 2) throw new Exception2("E2 in try");
 }catch(Exception1 e){
   count = 0; //释放资源
   throw e;  //再次把异常抛出,让上一级捕获。此时将不会执行catch外的语句,所以要先释放资源
 }catch(Exception2 e){
  count = 0; //释放资源
  return; //返回了,也不会执行catch外的语句,所以要先释放资源
 }
 count = 0; 

//释放资源,其实count=0程序不会执行这里的因为在执行期间先获得了前面的那个return语句所以后面就不会执行了。
}
这样,就需要在每一个可能返回的地方,以及每一个可能出现异常而导致程序跳转的地方,考虑如何释放资源,导致复杂和冗余。

所以,需要finally语句。
把资源释放或状态还原的代码放到finally块中,可以保证在try和catch语句执行完后,一定会执行finally语句块,而不用考虑各种复杂的跳转情况
1、int count = 0;
try{
 count++;
 if(count == 1)throw new Exception();
}catch(Exception e){
}finally{
 count = 0;
}

2.finally什么时候执行
finally在return语句之后,跳转到上一级程序之前执行。
public class Test { 
 public static void main(String[] args) {  
  System.out .println(test ());  
 }   
 public static String test() {  
  try {  
   System.out .println("try block");  
   return test1 ();  
  } finally {  
   System.out .println("finally block");
   //return "finally";    
  }  
 }  
 public static String test1() {  
  System.out .println("return statement");  
  return "after return";  
 }  
}
结果:
try block
return statement
finally block
after return

分析:
1.try语句块,return test1(),则调用test1方法
2.test1()执行后返回"after return",返回值"after return"保存在一个临时区域里
3.执行finally语句块。若finally语句有返回值,则此返回值将替换掉临时区域的返回值

4.将临时区域的返回值送到上一级方法中。


亲测是正确的:如果若finally语句有返回值,则此返回值将替换掉临时区域的返回值
参考:
《thinking in Java》

http://blog.csdn.net/mymyway/article/details/7954549


2,验证finally真正执行顺序

package lee;
    import java.io.*;
    public class Test1{
    public static void main(String argv[]){
      Test1 m=new Test1();
    System.out.println(m.amethod());
    }
    public int amethod(){
       try{
           FileInputStream dis =new FileInputStream("Hello.txt"); //1,抛出异常
       }catch ( Exception ex) {
               System.out.println("No such file found");   //2.catch捕获异常,并执行
               return -1;                                  //4,return 返回
       }finally{
               System.out.println("Doing finally");  //3.finally一定会在return之前执行。(准确说,应该是return ;语句)

       }
        return 0;
    }
    }

    输出结果为:

    No such file found
    Doing finally
    -1


总结:

finally其实是仅在return 语句执行前执行,如果return 一个函数,那么会先执行函数,但如果函数内有(return)语句,那么finally就会在这个return 语句前执行。finally在catch中的return之前执行但是如果catch中有返回值而finally中也有返回值的话finally中的返回值会替换catch中的返回值,因为catch中的返回值是存放在一个临时区中。

如果catch块有异常向外抛出,执行顺序呢:我执行说,你抛你得异常,我finally我的语句,我俩互不干涉,你别管我啥时执行,但我一定会执行。

关于finally,此时,应该很明朗了  您只需记着一点:除非调用system.exit()让程序退出也就是将调用这个程序的进程断开了退出了这个程序就不会执行或断电等因素致使程序停止进程终止,否则,无论任何因素,finally块都一定会执行。

版权声明:本文为博主原创文章,未经博主允许不得转载。

java中的异常以及 try catch finally以及finally的执行顺序

java try、catch、finally及finally执行顺序详解 1.为什么要用finally 先看一个没有finally的异常处理try-catch语句: 假设count...
  • QH_JAVA
  • QH_JAVA
  • 2013年10月21日 21:43
  • 14143

Java异常捕获之try-catch-finally-return的执行顺序

情况1:try块中没有抛出异常try和finally块中都有return语句 public static int NoException(){ int i=10; try{ S...
  • aaoxue
  • aaoxue
  • 2013年01月23日 21:45
  • 11996

关于try-catch、throw、finally在异常时的执行顺序

package test; //jdk 1.8 public class TestException1 { /** * catch中的return和throw是不能共存的(无论谁先谁后都编...
  • rainyspring4540
  • rainyspring4540
  • 2017年01月05日 11:04
  • 699

Java语言中try-catch-finally的执行顺序

最近遇到一道Java编程题目,让根据以下程序写输出: public static int func (){ try{ return 1; }catch (Excepti...
  • MOLIILOM
  • MOLIILOM
  • 2016年03月17日 00:26
  • 1473

有return的情况下try catch finally的执行顺序

背景:          昨天一个朋友出去面试,遇到这么一道题:“C#  catch里有return,finally里还执行吗?” 个人实践小结:         1、不管有木有出现异常,finall...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014年08月22日 08:08
  • 2324

try-catch语句中return和finally执行顺序详解

刷java面试题偶然看到这类问题(try/finally中含有return时的执行顺序),觉得挺有意思于是小小的研究了一下,希望经过我添油加醋天马行空之后,能给你带来一定的帮助 原题 try {...
  • zhoushumin157016
  • zhoushumin157016
  • 2017年06月15日 09:29
  • 527

java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

前言: java 中的异常处理机制你真的理解了吗?掌握了吗? catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System....
  • Lu_Ca
  • Lu_Ca
  • 2016年08月11日 17:00
  • 8334

Java中try catch finally语句中含有return语句的执行情况(总结版)

在这里看到了try catch finally语句中含有return语句的几种总结情况,但其实解释的很含糊,而且并不全面。但有一点是可以肯定的,finally块中的内容会先于try中的 return...
  • mmc_maodun
  • mmc_maodun
  • 2013年12月25日 23:06
  • 12935

Java异常捕获之try-catch-finally-return的执行顺序

情况1:try块中没有抛出异常try和finally块中都有return语句 [java] view plain copy public static ...
  • z69183787
  • z69183787
  • 2017年03月13日 17:23
  • 665

Java异常及异常块执行次序(try、catch、finally、return)

Java异常: ①使用try-catch-finally处理异常; ②使用throw、throws抛出异常; ③上边为java异常处理5个关键字。 异常是程序在设计时或运行时产生的错误,异常处理是处理...
  • typa01_kk
  • typa01_kk
  • 2015年04月16日 23:50
  • 1960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中的异常以及 try catch finally以及finally的执行顺序
举报原因:
原因补充:

(最多只允许输入30个字)