public class Catch { public static int test() { int a = 0; try { System.out.println("try:"+a); return a; } finally { System.out.println("finally:"+a); } } public static void main(String args[]) { System.out.println(test()); }} try:0 finally:0 0
简单的说 就是一个try 里面 无论什么情况 finally都会执行一次!
修改15楼例子说下 public static int test2() { int a=0; try { return a++; } finally { return ++a; } } 执行了try的a之后,会跳到finally执行++a,然后跳到try的a++然后到finally返回 看字节码可以证明前面的几句话,最后说到finally返回可以参考下面的代码 public static int test() { int a = 0; int b = 0; try{ return b; }finally { return ++a; } }
{
try
{
Console.WriteLine("executed in try");
return;
}
finally
{
Console.WriteLine("executed in finally");
}
Console.WriteLine("test over!");
}result:
executed in try
executed in finally
然后执行finally里的return。他会覆盖掉之前的值。最后返回的就是finally里的。
在return 前啊 ,finally里面的语句肯定要执行的
public static int test()
{
int a=0;
try
{
return a;
}
finally
{
++a;
}
}
public static int test2()
{
int a=0;
try
{
return a;
}
finally
{
return ++a;
}
}
public static void main(String args[])
{
System.out.println(test());
System.out.println(test2());
}
输出
0
1
我不太了解为什么结果是0,1 但是这样写的话finally里的return语句会有警告
如果finally里面也有return值则执行finally的return,会忽略catch那个return。
public static int test0()
{
// int a=0;
try
{
return a;
}
finally
{
++a;
}
}
/*
public static int test2()
{
int a=0;
try
{
return a;
}
finally
{
return ++a;
}
}
*/
public static void main(String args[])
{
System.out.println(a);
// System.out.println(test2());
}
输出为0,说明return 后finally 没有执行,test2执行能返回1,是将try中的return 覆盖掉了
我想说的是有返回值的情况下,jvm会先看try里有没有return;
有的话,先存储return的值。接下来才到finally;
再然后 取出之存储的值,执行return操作。
public class test
{
public static void test()
{
int a=0;//init a
try{
a++;
return ;
}
finally
{
a--;
}
}
}
public static void test();
Code:
0: iconst_0 //初始化 0 当前操作数
1: istore_0 //操作数存入 0 的位置
2: iinc 0, 1 //0位置的数 加 1 ;这里是try中的 a++
5: iinc 0, -1 //0位置的数 减 1 ;finally中的操作
8: return //返回
//下面的是异常时候 执行finally操作 然后抛出异常
9: astore_1
10: iinc 0, -1
13: aload_1
14: athrow
public class Catch {
public static int test() {
int a = 0;
try {
System.out.println("try:"+a);
return a;
} finally {
System.out.println("finally:"+a);
}
} public static void main(String args[]) {
System.out.println(test());
}}
try:0
finally:0
0
public static int test2()
{
int a=0;
try
{
return a++;
}
finally
{
return ++a;
}
}
执行了try的a之后,会跳到finally执行++a,然后跳到try的a++然后到finally返回
看字节码可以证明前面的几句话,最后说到finally返回可以参考下面的代码
public static int test()
{
int a = 0;
int b = 0;
try{
return b;
}finally
{
return ++a;
}
}
return 1
}catch(Exception e){
return 2
}finally{
return 3
}
最终返回的是3如果finally里面没有return,无异常返回1,有异常返回1