黑马程序员技术交流社区

标题: 这个程序,你会了不能说你多厉害,不会也不能说你不行.. [打印本页]

作者: 赵宇    时间: 2012-9-25 13:04
标题: 这个程序,你会了不能说你多厉害,不会也不能说你不行..

  1. public class ExceptionTest
  2. {
  3. public void method()
  4. {
  5. try
  6. {
  7. System.out.println("进入到try块");

  8. return;
  9. }
  10. catch(Exception ex)
  11. {
  12. System.out.println("异常发生了");
  13. }
  14. finally
  15. {
  16. System.out.println("进入到finally块");
  17. }

  18. System.out.println("异常处理后续的代码");
  19. }

  20. public static void main(String[] args)
  21. {
  22. ExceptionTest test = new ExceptionTest();

  23. test.method();
  24. }
复制代码

作者: 宁振庄    时间: 2012-9-25 13:13
输出结果为:
进入到try块
进入到finally块

无论如何finally都是会执行的,如果没有捕捉到异常,finally里面执行完毕后,后面的语句是会执行的,但是你这段代码在try{}里面多了一个return,所以执行完finally后直接return了,
后面的那句System.out.println("异常处理后续的代码");就没有被执行
作者: 汪小照    时间: 2012-9-25 13:17
这个程序其实就是在考finally是否会执行。
如果这个程序没有发生异常,则会执行System.out.println("进入到try块");System.out.println("进入到finally块");System.out.println("异常处理后续的代码");这三句话。
如果这个程序异常发生了,则会执行08.System.out.println("进入到try块");System.out.println("异常发生了");System.out.println("进入到finally块");这三句话。
综上所述:在这个程序中,不管异常是否会发生,总会执行finnally语句。补充:f在执行inall语句前遇到return语句一样会执行finaly语句,但是遇到system.exit(0)系统退出语句,finally语句就不会执行。







作者: 梁志冰    时间: 2012-9-25 13:30
public class ExceptionTest
{
public void method()
{
try
{
System.out.println("进入到try块");
return;
}
catch(Exception ex)
{
System.out.println("异常发生了");
}
finally
{
System.out.println("进入到finally块");
}
System.out.println("异常处理后续的代码");
}
public static void main(String[] args)
{
ExceptionTest test = new ExceptionTest();
test.method();
}
} //程序少个一个}  ,不然会报错的

运行结果:
进入到try块
进入到finally块

调用test.method()方法,首先执行try{}代码块,打印输出“进入到try块”,然后执行到return语句,让方法返回结束。但是在jvm虚拟机接收到返回return语句时,并没有立即执行,而是先执行finally代码块(因为finally代码块在虚拟机结束前,必须执行,一般用于关闭资源用;除非遇到System.exit(0)结束虚拟机,才不会执行),打印输出“进入到finally块”,执行完finally代码块后,才执行return语句,方法返回结束。

稍微将你的程序改动:
public class ExceptionTest
{
public void method()
{
try
{
System.out.println("进入到try块");
System.out.println(5/0); //让程序出现java.lang.ArithmeticException: / by zero异常
return;
}
catch(Exception ex)
{
System.out.println("异常发生了");
}
finally
{
System.out.println("进入到finally块");
}

System.out.println("异常处理后续的代码");
}

public static void main(String[] args)
{
ExceptionTest test = new ExceptionTest();

test.method();
}
}

输出结果:
进入到try块
异常发生了
进入到finally块
异常处理后续的代码

调用test.method()方法,执行try代码块,首先打印输出“进入到try块”,但执行到System.out.println(5/0);
发生了java.lang.ArithmeticException: / by zero异常,并抛出;由catch(){}捕获异常,并进行相应的处理,打印输出“异常发生了”;异常处理完成后,继续执行finally代码块,打印输出“进入到finally块”;整个try{}catch(){}finally{}异常抛出、捕获、处理结束、执行finally后,程序继续往下执行,打印输出“异常处理后续的代码”,test.method()执行结束。




作者: 张小龙    时间: 2012-9-25 13:30
关于try{}catch(){}finally{}的用法:
程序中由于调用的程序会抛出异常,所以必须处理异常或者抛出异常。
如果处理异常,就用try catch finally代码块
如果没有发生异常,则正常调用try里面的代码,如果发生了异常
则会进入到catch里面执行。finally里的代码是除非是System.exit();
否则一定会执行到。即使前面什么地方有return,也会执行finally
作者: 张文建    时间: 2012-9-25 14:21

public class ExceptionTest

{

public void method()
{

try

{

System.out.println("进入到try块");


return;

}

catch(Exception ex)

{

System.out.println("异常发生了");

}

finally

{

System.out.println("进入到finally块");

}


System.out.println("异常处理后续的代码");

}


public static void main(String[] args)

{

ExceptionTest test = new ExceptionTest();


test.method();

}
}
打印:
进入到try块
进入到finally块
如果将return注释以后:
打印结果为:
进入到try块
进入到finally块
异常处理后续的代码
由此可以知道try里面的return语句中finally执行完以后才执行return语句。。。
正如楼上所说的:
调用test.method()方法,首先执行try{}代码块,打印输出“进入到try块”,然后执行到return语句,让方法返回结束。但是在jvm虚拟机接收到返回return语句时,并没有立即执行,而是先执行finally代码块(因为finally代码块在虚拟机结束前,必须执行,一般用于关闭资源用;除非遇到System.exit(0)结束虚拟机,才不会执行),打印输出“进入到finally块”,执行完finally代码块后,才执行return语句,方法返回结束。


作者: 焦晨光    时间: 2012-9-25 14:43
ok,楼上各位都已经说的很清楚了

输出结果是:
进入到try块
进入到finally块

程序执行流程为:
1.主函数中调用method方法后
2.首先会输出 进入到try块
3.然后遇到return语句 执行到return后会把要返回的结果先保存(实际无返回值)
4.然后看finally块中是否有语句,如果有的话,就执行,执行完finally块中的语句后,执行return语句返回结果。
5.程序结束。
作者: 赵家阳    时间: 2012-9-25 15:55
来晚了,但只说两点:
    1,这段程序要注意return和finally的用法!
    2,楼主以后贴代码时缩进格式可否注意点??这样大家看代码时会轻松点!
方便你我他,轻松靠大家!{:soso_e141:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2