finally语句与return a++

finally与return a++

一、描述

当我知道 return a++; 是先返回再+1的,但是突然想起如果用try/finally语句捕获时,突然发现有三种有趣的情况:

  1. return a++;
  2. return ++a;
  3. return a+1;
    分别在finally语句会有不同的输出。

二、具体

代码如下:

public class Test {
    public static void main(String[] args) {
        System.out.println("s:"+test(1));
    }
    static int test(int a){
        try {
            //依次修改此处
            return a++;
            //return ++a;
            //return a+1;
        }finally {
            System.out.println("f:"+a);
        }
    }
}

运行结果依次如下

  1. return a++;
f:2
s:1
  1. return ++a;
f:2
s:2
  1. return a+1;
f:1
s:2

我们知道finally语句是在方法结束前运行的,其实上述代码反编译字节码之后会发现:

import java.io.PrintStream;

public class Test
{

    public Test()
    {
    }

    public static void main(String args[])
    {
        System.out.println((new StringBuilder()).append("s:").append(test(1)).toString());
    }

    static int test(int a)
    {
        int i = a++;//主要改此处
        System.out.println((new StringBuilder()).append("f:").append(a).toString());
        return i;
        Exception exception;
        exception;
        System.out.println((new StringBuilder()).append("f:").append(a).toString());
        throw exception;
    }
}

原来其实return后面的表达式,编译器会创建临时变量,操作完成再返回。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,401评论 0 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,870评论 18 399
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,484评论 1 44
  • 嫁的人是谁, 很重要, 因为他决定着你一辈子的生活状态。 娶的人是谁, 更重要, 她很有可能决定着你一生的层次和高...
    宁静雪2017阅读 303评论 0 1
  • 【敬畏】-【体验】-【持续】-【交给】-【显现】 1、缺啥补啥,怕啥练啥 2、一切为我所用,所用为团队大家 3、我...
    cac47ec5e164阅读 185评论 0 0

友情链接更多精彩内容