关于finally对返回值的影响

1、finally对返回值的影响



我们知道finally在try中return语句执行之后 返回之前 执行的。

如果try中最后return一个变量 ,那finally也对这个变量修改后 到底会返回什么?

直接上测试代码看例子:

class YfModel{
    private String name;

    public YfModel(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class ExceptionYf {
    public static int getIntValue1(){
        int result =9;
        try{
            result++;
            return result;
        }finally {
            //修改result的值
            result++;
        }
    }

    public static int getIntValue2(){
        int result =9;
        try{
            result++;
            return result;
        }finally {
            //finally里直接return
            return ++result;
        }
    }

    public static String getStringValue(){
        YfModel yfModel = new YfModel("default");
        try{
            yfModel.setName("yy");
            return yfModel.getName();
        }finally {
            //finally里修改对象的属性值
            yfModel.setName("ff");
        }

    }

    public static YfModel getModelValue(){
        YfModel yfModel = new YfModel("default");
        try{
            yfModel.setName("yy");
            return yfModel;
        }finally {
            yfModel.setName("ff");
        }
    }

    public static void main(String[] args){
        System.out.println("valueInt1="+ getIntValue1());
        System.out.println("valueInt2="+ getIntValue2());
        System.out.println("valueStr="+ getStringValue());
        System.out.println("valueModel="+ getModelValue().getName());
    }
}

上述代码返回结果:

valueInt1=10
valueInt2=11
valueStr=yy
valueModel=ff

结论:

a、对于基本类型或常量(如String) finally里即使修改了,也不会影响返回结果。

b、如果是对象类型,finally里修改了对象 是影响返回结果的。(因为复杂对象传递的是指针 指针指向的内存区域是一样的。)

所以不要在finally里return。这不是常规做法。

2、finally里不要再抛出异常



finally里再有异常 需要在finally里就捕获 打日志,不要再往外抛出,否则会覆盖try catch中原有的异常信息。

3、finally一定会执行吗



通常来说finally块一定会执行,常用于关闭流操作。

但如果try catch里执行了System.exit操作 表示虚拟机终止,则不会再执行finally。

原文地址:https://www.cnblogs.com/yangfei629/p/11444086.html

时间: 2024-08-12 02:46:07

关于finally对返回值的影响的相关文章

字节码分析finally块对return返回值的影响

直接进入主题.看如下代码: public int test(){ int i=0; try { i=1; return i; } catch (Exception e) { i=2; return i; }finally{ i=3; } } 相信有点经验的程序员一眼就能说出返回的结果为1,但是您真的知道返回的结果为什么为1吗?下面我们通过分析下当前方法的字节码,来说明为什么. 查看字节码命令:javap -verbose class文件 ? 知识点简单概要:看如下字节码需要简单了解下栈的结构.栈

try-catch-finally对返回值的影响

catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源. finally 块用于清理try块分配的任何资源,无论try中是否异常或者终止(return),finally块都会执行. 如果在finally块中修改了返回值,会对最终返回的结果有何影响呢? 1,如果返回值是值类型 //finally执行,i值是2013,但是最终返回2015 static int test() { int i = 201

ExecuteNonQuery()返回值

查询某个表中是否有数据的时候,我用了ExecuteNonQuery(),并通过判断值是否大于0来判断数据的存在与否.结果与我所设想的很不一致,调试时才发现,其执行后返回的结果是-1,对此我很是不理解,回头查了下资料,如下显示:SqlCommand.ExecuteNonQuery 方法对连接执行 Transact-SQL 语句并返回受影响的行数.备注:可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE.INSERT

【转】ThinkPHP中数据库操作返回值总结

Thinkphp中的Think\Model类提供了数据库的基本CURD(Create.Update.Read及Delete),通过该类可以很便捷的进行操作.Model类及扩展类主要的方法有: Create操作:create()(非链式) .add().addAll()支持的链式操作有:table .data.field .relation .validate.auto .filter.scope .bind .token .comment Update操作save().setField().se

ExecuteNonQuery()返回值注意点

查询某个表中是否有数据的时候,我用了ExecuteNonQuery(),并通过判断值是否大于0来判断数据的存在与否.结果与我所设想的很不一致,调试时才发现,其执行后返回的结果是-1,对此我很是不理解,回头查了下资料,如下显示: SqlCommand.ExecuteNonQuery 方法对连接执行 Transact-SQL 语句并返回受影响的行数. 备注:可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE.INSER

ThinkPHP中数据库操作返回值总结

转自:http://www.baiwar.com/post/thinkphp-database-operations-in-the-return-value.html Thinkphp中的Think\Model类提供了数据库的基本CURD(Create.Update.Read及Delete),通过该类可以很便捷的进行操作.Model类及扩展类主要的方法有: Create操作:create()(非链式) .add().addAll()支持的链式操作有:table .data.field .rela

mybatis 中的 update 返回值

摘自:https://www.jianshu.com/p/80270b93082a 如果定义一个如下的update函数,那么这个函数的返回值到底是啥意思呢?是受影响的行数吗? 验证之前我们先看看数据库中的数据记录.总共两条数据记录! 数据库链接配置为: jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=123456 下面看看我们的单

js onclick="return test()"事件返回值,对有些事件,会影响默认动作的执行。如:onclick和onsubmit

onclick="return test()"事件返回值,对有些事件,会影响默认动作的执行.如:onclick和onsubmit <body> <!--事件返回值,对有些事件,会影响默认动作的执行.如:onclick和onsubmit--> <!--多用于表单提交--> <a href="http://www.baidu.com" onclick="return test()">baidu</

EF5中 执行 sql语句使用Database.ExecuteSqlCommand 返回影响的行数 ; EF5执行sql查询语句 Database.SqlQuery 带返回值

一: 执行sql语句,返回受影响的行数 在mysql里面,如果没有影响,那么返回行数为  -1 ,sqlserver 里面  还没有测试过 using (var ctx = new MyDbContext()) { ctx.Database.ExecuteSqlCommand("UPDATE Person SET Name = 'Michael' WHERE PersonID = 1"); } 二 : Database.SqlQuery<T>   EF5执行sql查询语句