关于Java中try catch finally 的执行顺序一直是入职笔试的一个热门,其实在实际的项目中还是遇到的比较多,所以整理如下:
需要首先注意的几点:
1) try catch finally中的finally不管在什么情况之下都会执行,执行的时间是在程序return 之前.
2) Java 编译器不允许有显示的执行不到的语句块,比如return之后就不可能再有别的语句块(分支不属于此列) 所以以下程序编译会报错:
public String testSeq(){ String result = ""; int i = 0; try{ System.out.println(6/i); System.out.println("in try..."); } catch(Exception e){ e.printStackTrace(); System.out.println("In catch..."); }finally{ System.out.println("In finally...."); return "finally"; } return result; }
finally 块中已经存在return了,出现不可到达编译错误
public static int test3() { try{ System.out.println("try"); return 1; } catch (Exception e) { System.out.println("catch"); return 2; } finally { System.out.println("finally"); } return 3;//此句出现编译错误,不可到达的编译错误,因为try和catch中都出现了return语句 }
几个关于try catch finally的小例子:
1)
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 0;//如果把最后这个return语句注释掉,编译错误,因为该方法会找不到返回值 }
运行结果:
No such file found
Doing finally
-1(返回值是-1)
2)
public static int test3() { try{ System.out.println("try"); return 1; } catch (Exception e) { System.out.println("catch"); } finally { System.out.println("finally"); } return 2;//如果把此句注释掉,编译错误,方法找不到返回值 }
运行结果:
try
finally
1(return value)
3)
public String testSeq(){ String result = ""; int i = 0; try{ System.out.println("in try..."); return "try"; }catch(Exception e){ e.printStackTrace(); System.out.println("In catch..."); return "catch"; }finally{ System.out.println("In finally...."); return "finally"; } }
输出结果为:
in try... In finally.... finally(return value)
4)
public String testSeq(){ String result = ""; int i = 0; try{ i = 7/i; System.out.println("in try..."); return "try"; }catch(Exception e){ e.printStackTrace(); System.out.println("In catch..."); return "catch"; }finally{ System.out.println("In finally...."); return "finally"; } }
输出结果:
java.lang.ArithmeticException: / by zero at com.ncs.eric.TestTryCatchFinally.testSeq(TestTryCatchFinally.java:9) at com.ncs.eric.TestTryCatchFinally.main(TestTryCatchFinally.java:24) In catch... In finally.... finally(return value)
5)
public static String test() { try { System.out .println("try block"); return test1 (); } finally { System.out .println("finally block"); } } public static String test1() { System.out .println("return statement"); return "after return"; }
运行结果:
try block return statement finally block after return(return value)
分析:
1.try语句块,return test1(),则调用test1方法
2.test1()执行后返回"after return",返回值"after return"保存在一个临时区域里
3.执行finally语句块。若finally语句有返回值,则此返回值将替换掉临时区域的返回值
4.将临时区域的返回值送到上一级方法中。
总结:finally其实是仅在return 语句执行前执行,如果return 一个函数,那么会先执行函数,但如果函数内有(return ;)语句,那么finally就会在这个(return ;)语句前执行
相关推荐
try、catch、finally、return 执行顺序详细讲解 try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return ...
try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...
在这个结构中,`try`块包含可能会抛出异常的代码,每个`catch`块分别捕获不同类型的异常,`finally`块则包含需要无论发生何种情况都必须执行的代码,如资源清理。 接下来,我们来探讨嵌套的`try-catch`块。当一个`...
多个 `catch` 块按照它们在代码中的顺序来处理异常。如果某个异常类型被两个或更多 `catch` 块所捕获,则最先定义的那个 `catch` 块会被执行。 #### 六、结论 通过以上的介绍,我们可以看到 `try-catch` 在异常...
如果在`try`块中的代码没有发生任何异常,那么`catch`块将不会被执行,程序会直接跳到`finally`块。 如果`try`块中的代码确实抛出了一个异常,那么相应的`catch`块会被执行。`catch`块通常包含处理特定异常的代码,...
1. `catch`块的顺序:如果有多个`catch`块,应该将更具体的异常类型放在前面,因为一旦一个`catch`块捕获了异常,后续的`catch`块将不再执行。 2. 避免过度使用`catch`:如果只捕获异常而不处理,可能会掩盖真正的...
Java try catch finally异常处理组合详解 Java try catch finally异常处理组합是Java语言中的异常处理机制,用于捕获和处理程序中的异常。下面对try catch finally异常处理组合进行详细的介绍。 try catch组合: ...
即使在`try`或`catch`块中有`return`语句,`finally`块的代码也会被执行。 ```csharp finally { // 无论是否发生异常都会执行的代码 } ``` 在示例中,无论`j`的值是否为0,`finally`块的`Console.WriteLine(j....
在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细探讨 finally 语句块与 return 的执行关系。 首先,需要了解的是,在 try-finally 或者 catch-finally 中,如果 try 或者 ...
"Java中try finally return语句的执行顺序浅析" 关于Java中try finally return语句的执行顺序浅析是Java语言中一个重要的知识点,今天我们来探讨一下try finally return语句的执行顺序。 首先,需要了解的是...
在`finally`块中,即使在`try`或`catch`块中抛出异常,也会执行清理代码。在上面的`CodeWithCleanup`方法中,`finally`块确保了`FileStream`在不再需要时会被关闭,即使在写入过程中发生异常。 需要注意的是,`...
`try`块包含可能会抛出异常的代码,`catch`块捕获并处理这些异常,而`finally`块则包含必须执行的清理代码。`finally`的执行规则如下: 1. 如果`try`块中的代码没有抛出异常,那么`finally`块会在`try`块结束时执行...
- 如果try块中的代码抛出异常,将按顺序检查`catch`块,找到匹配异常类型的`catch`并执行相应的处理代码。执行完`catch`后,`finally`块的代码会执行。 - 如果所有`catch`块都不能匹配抛出的异常,异常会被提交给...
1. **不要单独使用 try、catch 或 finally 语句块**:在Java中,`try`语句块用于包含可能抛出异常的代码,`catch`用于捕获并处理特定类型的异常,而`finally`则用于定义无论是否发生异常都要执行的清理代码。...
总结一下,`try-catch-finally`块中的`return`语句执行顺序如下: 1. `try`块中的代码被执行。 2. 如果遇到`return`语句,会创建一个临时变量,保存`return`语句要返回的值。 3. `finally`块被执行。 4. `finally`...
#### 五、try-catch-finally 的执行顺序 1. **正常执行**:如果`try` 块内的代码正常执行完毕(没有抛出异常),则执行`finally` 块。 2. **异常发生**:如果`try` 块内的代码抛出了异常,并且有对应的`catch` 块...
这里的 `finally` 块是确保即使在 `try` 或 `catch` 中发生异常,`finally` 里的代码也能得到执行,这对于资源管理非常重要,如关闭数据库连接、文件流等。 3. `finalize()` 方法: `finalize()` 是一个特殊的...
例如,如果`try`或`catch`块中有一个`return`语句,`finally`块将在`return`之前执行,但不会阻止`return`语句的执行。 关于字节码层面的解释,根据《深入Java虚拟机》一书的描述,`finally`块的实现是通过`jsr`...
这种方式使得程序能够在遇到错误时,不按照正常的顺序执行,而是跳转到预先设定的错误处理代码。 在C异常处理机制中,通常会定义一系列宏来模仿`try-catch`块的行为。例如,`try`宏会创建一个异常帧(`Except_frame...
可以有多个catch块,按顺序执行。 - **finally块**:无论是否发生异常都会执行,常用于资源的释放。 2. **多重catch和嵌套try-catch**: - **多重catch**:在一个try块后面可以有多个catch块,每个catch块处理...