黑马程序员技术交流社区
标题:
try{}catch()finaly{}代码如何执行的
[打印本页]
作者:
袭喜悦
时间:
2013-2-16 00:15
标题:
try{}catch()finaly{}代码如何执行的
<P>class ExceptionDemo
{
public static void main(String[] args)
{
Demo d = new Demo();</P>
<P> try
{
int x = d.div(4,-1);
System.out.println("x="+x);
return;//<FONT color=red>在try代码快里面加入一个return语句</FONT>
</P>
<P> }
catch (FuShuException e)
{
System.out.println(e.toString());
return;
}
finally
{
System.out.println("finally");
}</P>
<P>
System.out.println("over");
}
}</P>
复制代码
在try代码块里加入return语句,finally代码块里的语句还会执行吗?什么时候执行?在return语句之前还是之后?
作者:
王钊
时间:
2013-2-16 11:22
会执行,在return语句之前执行,执行完finally块之后再执行return。
除非在try块、catch块中调用了退出虚拟机的方法(System.exit(参数)),否则在执行怎样的代码,出现怎样的情况,异常处理的finally块总会被执行。
另外,在通常情况下,不要在finally块中使用如return或throw等导致方法终止的语句,否则会导致try块、catch块中的return、throw语句失效。
作者:
李培根
时间:
2013-2-16 12:20
张孝祥老师解答过这个问题,可以说是在return中间执行,执行到return后会开辟空间将结果存入到内存空间中。然后执行finally中的代码,执行代码完毕后返回内训空间中所存的值。
public class FinallyDemo {
public static void main(String[] args) {
System.out.println(get1());//打印结果1
System.out.println(get2());//打印结果2
}
private static int get2() {
try {
return 1;
} finally {
return 2;
}
}
private static int get1() {
int x = 1;
try {
return x;
} finally {
x = 5;
}
}
}
作者:
陈科宇
时间:
2013-2-16 12:31
朋友,之前已经有人问过这个问题。finally确实是奇葩,在catch块或try块里加入return语句,finally里的语句依然会执行。而且原则是一旦在try块或catch块里遇到return关键字,会先去执行finally里的内容。如果此时finally也有return那么try和catch块里的return不再拥有执行机会。有一种情形例外,那就是在try块或catch块里加入了System.exit(0)的语句,finally再神通广大,也无机会执行。
作者:
李洪因
时间:
2013-2-16 13:04
try
{
执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}
作者:
李大强
时间:
2013-2-16 13:29
关于此类问题的总结如下:
1、正常情况下:
当程序把try{}语句块内的代码执行完毕后,如果一直都没有错误,此时程序将跳过catch{}语句块,执行finally{}语句块内的代码;
2、当出现异常时
此时程序将不再执行try{}语句块内的内容,转而到catch{}语句块中寻找对应的异常处理方式,
这里需要声明的是catch{}语句块可以有多个,但排列的顺序要从小到大排,例如:如果最上面的的catch语句为(Exception e)的话,那么
下面的catch{}将不会执行!因为所有的异常都已经被“Exception”截获了!
当catch语句处理完异常以后,程序将再转到finally{}语句块执行!
3、更加特殊的
就算你try{}语句块中没有出现异常,而且加了“return”语句,当程序执行到此后依然会转去执行finally{}语句块
4、如果finally{}语句块中有return语句的话,try{}语句块中的return代码将不会被执行
5、特别的
当你在try{}或catch{}语句块中直接调用了System.exit(0)时,此时虚拟机将退出,finally{}才不会被执行!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2