源代码如下:输出结果为
aaaa1
bbbb2
public class Test {
public static void main(String[]args) {
System.out.println("aaaa"+Test.test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
System.err.println("bbbb"+x);
}
}
}
疑惑:个人理解如下,由输出结果表明,先执行了return,输出了aaaa1。然后在执行了finally,输出了bbbb2。但是如果先执行了return,不就代表了该方法结束了,所以finally不在执行?如果先执行了fanally,不应该是先输出bbbb2吗?
简单点来说,其实是先执行return,但是return并没有执行完,然后执行finally,最后执行return的剩下部分。你可以参考下
不管return执行还是不执行,都会执行finally
有具体分析 http://blog.csdn.net/ns_code/article/details/17485221
finally 才不管你return 在哪呢╭(╯^╰)╮
我不知道你用什么ide执行的,反正我执行了多次,顺序是不同的,有aaa1,bbbb2,也有bbb2,aaa1.你也试试,顺序是随机的。
try catch finally 常常一块使用, finally 代表的是最终执行语句 不管你前面执行什么 最后都会走到这段语句块中的,
finally 常常用来关闭流操作、连接等 以防资源浪费或出现堆溢出情况 ;
除非 你在try 或 catch 中 执行了 System.exit(2); 停掉JVM 这样就不会走 finally了 哈哈。
好久没写java了,怎么会这样,我记得当时学的是,try catch,如果try中有返回,会对返回值进行临时储存,然后执行finally,执行完了,才会把值返回去啊,这样,你把test方法拎出来,声明一个int保存它,然后再用system输出看顺序会不会固定
还是有点规律的,你的aaa后跟的都是1,bbb后面跟的都是2
你试试在finally里面加个return x;再分析分析
顺序是固定的, ,
最大的区别在于 输出信息
优先级的问题
System.out.println 优先
System.err.println 略慢
这个肯定返回finally的
finally是后执行,先执行的是return.其实java方法遇到return后,是把return的值返回到方法返回值区域,但是方法并没有执行完,如果没有finally,遇到return后,方法还是会继续执行,一直运行到方法的最后一个大括号”} ”后方法才结束。但是由于返回值已经被return返回到方法返回区了,所以return之后的代码对方法的返回值没有影响!!
System.out与System.err.
2者分别是同步的:
如果仅使用其中一种.那么先运行的代码先输出,后运行的代码后输出.
但如果2这混用 如:
System.out.print("1");
System.err.print("2");
那么1与2的顺序理论上是不固定的.System.out与System.err两者是不同步的.他们的顺序基于cpu的调度
public class Demo {
public static void main(String[]args) {
System.out.println("aaaa"+Demo.test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
System.err.println("bbbb"+x);
return x;
}
}
}
你先运行一下这段代码,,,再看我解释
先执行return,是对的,,,执行完return 后会把 x 的值放在一个待返回的地方 ,此时待返回 值为 1
然后执行finally 是修改了x的值,,但是木有修改 待返回的值,,,待返回值仍然是1
我这个例子,,在finally中修改了,,待返回值,结果就是:
首先,你System.out.println和System.err.println混着用就会出现多次运行,出现不同的答案,这个与jvm调度有关。
如果你都用out,就不会了,输出结果唯一。
其次,finally中的代码永远都是在try里面return之前执行的,程序执行完try里面的代码并不会立即返回,而是把值存在栈中,执行完finally里面的代码
后再return。还有,不管try里面的代码执行不执行,finally语句都会执行,一般用来释放资源。
本屌能力有限,希望能为你这有意思的代码做个较好的解释。
因为不管try中如何 finally都会执行,虽然try中是return 但是return后方法退出前,会看看有没有finally 有先去执行finally之后输出return
如图:
BBBBBB3
AAAAAA2
都统一用out err这个会有不一样
先按顺序执行,直到return语句,在判断是否有finally,如果有,执行finally语句。
当执行finally语句时,如果fina;lly语句中有return语句,他就会覆盖前面的return语句,即使是catrch语句中,也会被覆盖
很简单,先执行static 静态代码块,然后从上到下,执行return ,所有 返回一个1,然后执性finally ++i,返回一个2,最后在主方法里面输出出来,就是先输出1,在输出2
一般都不用写return在try里面
try==>return==>finally
据说 finally return 的值 会覆盖 catch 或者try 代码块中的返回值