`
hunankeda110
  • 浏览: 746983 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java中的try-catch 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; //释放资源
}
这样,就需要在每一个可能返回的地方,以及每一个可能出现异常而导致程序跳转的地方,考虑如何释放资源,导致复杂和冗余。

所以,需要finally语句。
把资源释放或状态还原的代码放到finally块中,可以保证在try和catch语句执行完后,一定会执行finally语句块,而不用考虑各种复杂的跳转情况。
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 ;)语句前执行。

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

关于finally,此时,应该很明朗了  您只需记着一点:除非调用system.exit()让程序退出或断电等因素致使程序中止,否则,无论任何因素,finally块都一定会执行!!

0
5
分享到:
评论

相关推荐

    try-catch-finally执行顺序验证

    try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...

    java try…catch嵌套捕获异常的实例

    在这个结构中,`try`块包含可能会抛出异常的代码,每个`catch`块分别捕获不同类型的异常,`finally`块则包含需要无论发生何种情况都必须执行的代码,如资源清理。 接下来,我们来探讨嵌套的`try-catch`块。当一个`...

    try-catch的用法和含义

    `try-catch` 结构作为异常处理的核心机制,在各种编程语言中广泛采用,如 Java、C# 和 JavaScript 等。本文将深入探讨 `try-catch` 的基本概念、语法结构及其应用场景。 #### 一、`try-catch` 的基本概念 `try-...

    try、catch、finally、return 执行顺序.doc

    try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return 执行顺序的规则和特点。 首先,我们需要了解 try...

    java 中finally语句块与return的执行关系

    需要注意的是,在 finally 中改变 return 的值对返回值没有任何影响,这是因为 finally 中的代码是在 return 前执行的,而 return 语句是在 finally 中执行的。因此,对于基本类型的数据,在 finally 中改变 return ...

    try catch finally的执行顺序深入分析

    在Java、C#、JavaScript等语言中,`try-catch-finally`结构是异常处理的基础。这个结构的执行顺序是固定的,下面我们将深入分析其工作原理。 首先,程序会尝试执行`try`块中的代码。`try`块的作用是包含可能抛出...

    Java异常处理-异常处理的方式1

    - 如果try块中的代码抛出异常,将按顺序检查`catch`块,找到匹配异常类型的`catch`并执行相应的处理代码。执行完`catch`后,`finally`块的代码会执行。 - 如果所有`catch`块都不能匹配抛出的异常,异常会被提交给...

    Java try catch finally异常处理组合详解

    Java try catch finally异常处理组合详解 Java try catch finally异常处理组합是Java语言中的异常处理机制,用于捕获和处理程序中的异常。下面对try catch finally异常处理组合进行详细的介绍。 try catch组合: ...

    关于Java中try finally return语句的执行顺序浅析

    例如,在try语句块中执行了System.exit(0)语句,终止了Java虚拟机的运行,finally语句块也不会执行。 下面是一个示例代码Demo2: public class Test { public static void main(String[] args) { System.out....

    JAVA课件---很快的掌握java语言

    通过try-catch-finally块,程序员可以捕获和处理运行时错误,防止程序意外终止。异常是程序运行时出现的不正常情况,Java提供了一系列预定义的异常类,也可以自定义异常。 了解了基础后,我们需要掌握Java集合框架...

    java异常ppt

    Java通过一套结构化的异常处理机制来管理这些问题,主要包括五个关键字:try、catch、finally、throw和throws。 `try`块包含可能抛出异常的代码,如果在`try`块中发生异常,控制流会立即跳转到匹配的`catch`块。`...

    java学习课件--适合初学者

    Java使用try-catch-finally结构来捕获和处理程序运行时可能出现的错误,确保程序的健壮性。此外,Java集合框架是管理对象集合的重要工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如...

    Java语言程序设计:JAVA_7-异常.ppt

    - **try-catch-finally**:这是Java中常用的异常处理结构。`try`块包含可能抛出异常的代码,`catch`块捕获并处理特定类型的异常,`finally`块包含无论是否发生异常都需要执行的清理代码,如关闭文件流等。 4. **...

    java 的试题------

    5. **异常处理**:Java通过try-catch-finally语句块来处理运行时错误,提供了一种结构化的异常处理机制。异常类层次结构始于Throwable,分为Error和Exception两类。 6. **集合框架**:Java集合框架是管理和操作对象...

    Java异常处理PPT教案学习.pptx

    在实际应用中,`try-catch-finally`结构经常被用来确保即使在异常发生时也能执行必要的清理工作。例如,关闭文件流、释放网络连接等。`finally`块的代码总是会被执行,无论`try`块是否抛出异常,这提供了一种保证...

    Java题库1-单项选择题.pdf

    - Java通过try、catch、finally语句处理程序中的错误和异常。 2. 异常类型: - IOException为Java I/O流操作中可能出现的异常。 - Throwable是所有错误和异常的超类。 - Error表示严重的错误,通常指的是系统...

    Java finally语句到底是在return之前还是之后执行?

    在这个例子中,无论`try`或`catch`块中的`return`语句如何,`finally`块都会执行,确保文件流被关闭。 总的来说,Java的`finally`语句块确保了关键代码的执行,尤其是在处理异常或资源清理的情况下。理解`finally`...

    Java选择题.pdf

    8. try-catch-finally执行顺序:当try块中的return语句执行时,finally块的代码会在return之前执行。因此,选项C正确。 9. 异常处理和返回值:在try-catch-finally结构中,finally块的return语句总是最后执行,所以...

    Java-In-A-Nutshell-5th-Edition(2)

    - 异常处理:Java提供了异常处理机制,通过try-catch-finally语句块确保程序的健壮性。 - 多线程:Java内置了对多线程的支持,可以创建和管理多个执行线程,实现并发执行。 2. **语法特性** - 泛型:引入泛型...

Global site tag (gtag.js) - Google Analytics