A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
输出结果为:
进入到try块
进入到finally块

无论如何finally都是会执行的,如果没有捕捉到异常,finally里面执行完毕后,后面的语句是会执行的,但是你这段代码在try{}里面多了一个return,所以执行完finally后直接return了,
后面的那句System.out.println("异常处理后续的代码");就没有被执行

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个程序其实就是在考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语句就不会执行。






评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1 很给力!

查看全部评分

回复 使用道具 举报
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()执行结束。



回复 使用道具 举报
关于try{}catch(){}finally{}的用法:
程序中由于调用的程序会抛出异常,所以必须处理异常或者抛出异常。
如果处理异常,就用try catch finally代码块
如果没有发生异常,则正常调用try里面的代码,如果发生了异常
则会进入到catch里面执行。finally里的代码是除非是System.exit();
否则一定会执行到。即使前面什么地方有return,也会执行finally
回复 使用道具 举报

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语句,方法返回结束。

回复 使用道具 举报
ok,楼上各位都已经说的很清楚了

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

程序执行流程为:
1.主函数中调用method方法后
2.首先会输出 进入到try块
3.然后遇到return语句 执行到return后会把要返回的结果先保存(实际无返回值)
4.然后看finally块中是否有语句,如果有的话,就执行,执行完finally块中的语句后,执行return语句返回结果。
5.程序结束。
回复 使用道具 举报
来晚了,但只说两点:
    1,这段程序要注意return和finally的用法!
    2,楼主以后贴代码时缩进格式可否注意点??这样大家看代码时会轻松点!
方便你我他,轻松靠大家!{:soso_e141:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马