异常处理 try...catch...finally 执行顺序, 以及对返回值得影响

结论:
1、不管有没有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
举例:
情况1:try{} catch(){}finally{} return;
            显然程序按顺序执行。
情况2:try{ return; }catch(){} finally{} return;
          程序执行try块中return之前(包括return语句中的表达式运算)代码;
         再执行finally块,最后执行try中return;
         finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:try{ } catch(){return;} finally{} return;
         程序先执行try,如果遇到异常执行catch块,
         有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
                     最后执行catch块中return. finally之后也就是4处的代码不再执行。
         无异常:执行完try再finally再return.
情况4:try{ return; }catch(){} finally{return;}
          程序执行try块中return之前(包括return语句中的表达式运算)代码;
          再执行finally块,因为finally块中有return所以提前退出。
情况5:try{} catch(){return;}finally{return;}
          程序执行catch块中return之前(包括return语句中的表达式运算)代码;
          再执行finally块,因为finally块中有return所以提前退出。
情况6:try{ return;}catch(){return;} finally{return;}
          程序执行try块中return之前(包括return语句中的表达式运算)代码;
          有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
                       则再执行finally块,因为finally块中有return所以提前退出。
          无异常:则再执行finally块,因为finally块中有return所以提前退出。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
                  如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
                  编译器把finally中的return实现为一个warning。

(一)   一般情况下,程序执行到try里面的内容一定会执行finally里面的内容。如果在try或者catch里面遇到return,那么函数在执行完return后面的表达式之后,会先去执行finally里面的语句块,然后再结束方法体。但有一种特殊情况,如果在try里面有System.exit(0)这样的语句,System.exit(0)是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。现在考虑一般情况下,try,catch,finally与return的执行。

(二) 讨论返回值的类型

1.返回值是基本数据类型。

在这种情况下,返回的数据不会被return之外的语句影响。

例子:

public class Test {

    public static void main(String[] args) {
System.out.println("main:" + getI() );
} public static int getI() {
int i = 1;
try {
i++;
System.out.println("try:" + i);
throw new FileNotFoundException();
} catch (Exception e) {
i+=2;
System.out.println("catch:" + i);
return i;
} finally {
i+=3;
System.out.println("finally:" + i);
}
}
} 结果:
try:2
catch:4
finally:7
main:4

2.返回值是引用数据类型。

在这种情况下,返回的数据可以被return之外的语句影响。

例子:

public class Test {

    public static void main(String[] args) {
System.out.println("main:" + getStr() );
} public static StringBuffer getStr() {
StringBuffer str = new StringBuffer("ab");
try {
str.append("try");
System.out.println("try:" + str);
throw new FileNotFoundException();
} catch (Exception e) {
str.append("catch");
System.out.println("catch:" + str);
return str;
} finally {
str.append("finally");
System.out.println("finally:" + str);
}
}
} 结果:
try:abtry
catch:abtrycatch
finally:abtrycatchfinally
main:abtrycatchfinally

3.返回是对象类型

public static void main(String[] args) {
System.out.println("main:" + getPerson() );
} public static String getPerson() {
Person person = new Person();
try {
person.setName("小明");
System.out.println("try:" + person);
throw new FileNotFoundException();
} catch( Exception e ) {
person.setSex('男');
System.out.println("catch:" + person);
return person.toString();
} finally {
person.setAge(24);
System.out.println("finally:" + person);
} }
}
结果:
 

异常处理 try...catch...finally 执行顺序, 以及对返回值得影响的更多相关文章

  1. Java异常处理机制以及try-catch-finally-return执行顺序

    一,简单描述: 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. 二,JAVA中用2种方法处理异常: 1.在发生异常的地方直接 ...

  2. try catch finally 执行顺序面试题总结

    在网上看到一些异常处理的面试题,试着总结一下,先看下面代码,把这个方法在main中进行调用打印返回结果,看看结果输出什么. public static int testBasic(){ int i = ...

  3. try catch finally执行顺序

    1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return表达式运算后前执行的,所以函数返回值 ...

  4. try..catch..finally执行顺序return

    try..catch..finally这个语法大家都很熟悉,就是捕捉异常.处理异常,面试中经常被问到的一个问题是:如果在try...catch中的某某地方return了,那么之后的某某步骤还会不会执行 ...

  5. JAVA代码中加了Try...Catch的执行顺序

    public static String getString(){ try { //return "a" + 1/0; return "a"; } catch ...

  6. try catch finally执行顺序 (return / 变量覆盖)

    finally有return 始终返回finally中的return 抛弃 try 与catch中的return 情况1:try{} catch(){}finally{} return x; try{ ...

  7. Junit指定测试执行顺序

    原文链接: Test execution order原文日期: 2012年12月06日翻译日期: 2014年7月2日翻译人员: 铁锚说明: Junit4.11版本及以后才支持,建议升级到最新版本.按照 ...

  8. python nose测试框架全面介绍十二 ----用例执行顺序打乱

    在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...

  9. 【转】C# 异常处理 throw和throw ex的区别 try catch finally的执行顺序(return)

    [转]throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查 ...

随机推荐

  1. excle导出使用poi

    package com.ittax.core.util; import java.util.List; import javax.servlet.ServletOutputStream; import ...

  2. [JavaScript]如何实现一个JS脚本能在browser和NodeJs里都是用

    下面是一个Common的Solution 'use strict'; // Universal Module Definition (UMD) to support AMD, CommonJS/Nod ...

  3. Python序列类型各自方法

    在Python输入dir(str).dir(list).dir(tuple)可查看各种序列类型的所有方法. 对于某个方法不懂怎么使用的情况,可以直接help(str.split)对某个方法进行查询. ...

  4. Jenkins自动化CI CD流水线之5--pipeline

    一.概览 二.安装 在对jenkins进行初始化安装时,默认已经安装了jenkins的相关插件,如下图所示: 三.实操 新建任务: 编写pipeline脚本: 我们可以借助流水线语法去做. test流 ...

  5. linux安装php7

    之前一直对linux研究的比较少,终于下定决心好好把linux玩一下 首先~我是安装了vm虚拟机,然后使用的是centos7的版本.因为vm不好复制粘贴,故使用了xshell连接了我的linux进行操 ...

  6. 2.1 GO 变量定义

    GO有四种数据类型,数字.布尔.字符.派生类型:这里使用前三种简单类型来说明变量的定义与使用 package main import "fmt" var ( aa = 1 bb = ...

  7. mgo02_mongodb启动警告处理

    ** WARNING: Access control is not enabled for the database. 原因分析:新版本的MongDB增加了安全性设计,推荐用户创建使用数据库时进行验证 ...

  8. 8-----BBS论坛

    BBS论坛(八) 8.1.发送邮箱验证码功能 (1)cms/resetemail.html {% from 'common/_macros.html' import static %} {% bloc ...

  9. Linux执行.sh文件Permission denied

    执行sh文件报没有权限: 看下该文件的权限: 缺少执行的权限,直接加上吧: test.sh 权限加上去了,可以执行sh文件了 若用 chmod 4755 filename 可使此程序具有root的权限

  10. SQL SERVER – Configuration Manager – Cannot Connect to WMI Provider. You Do Not Have Permission or The Server is Unreachable

    打开SQL SERVER Configuarion Manger 出现以下错误 SQL Server Configuration Manager—————————Cannot connect to W ...