finally與return a++
一、描述
當(dāng)我知道 return a++; 是先返回再+1的,但是突然想起如果用try/finally語句捕獲時(shí),突然發(fā)現(xiàn)有三種有趣的情況:
- return a++;
- return ++a;
- return a+1;
分別在finally語句會(huì)有不同的輸出。
二、具體
代碼如下:
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);
}
}
}
運(yùn)行結(jié)果依次如下
- return a++;
f:2
s:1
- return ++a;
f:2
s:2
- return a+1;
f:1
s:2
我們知道finally語句是在方法結(jié)束前運(yùn)行的,其實(shí)上述代碼反編譯字節(jié)碼之后會(huì)發(fā)現(xiàn):
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;
}
}
原來其實(shí)return后面的表達(dá)式,編譯器會(huì)創(chuàng)建臨時(shí)變量,操作完成再返回。