一、finally语句块是否一定运行?

Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是。当然他们的回答是正确的,经过试验。至少下面有两种情况下finally语句是不会被运行的:

(1)异常捕获机制finally块与try和catch块是关联的。既然是关联的假设try...catch...finally语句逻辑上达不到没有被运行,如在try语句之前就返回了,这样finally语句就不会运行,这也说明了finally语句被运行的必要而非充分条件是:对应的try...catch...finally语句一定被运行到。

(2)在try块中有System.exit(0);这种语句,System.exit(0);是终止Java虚拟机JVM的。连JVM都停止了。所以都结束了,当然finally语句也不会被运行到。

二、finally语句块是否一定会运行,遇到return怎么办?

public class FinallyTest1 {

	public void  test(){
try{
System.out.println("Try statement block……");
return ;
}catch(Exception e){
System.out.println("Exception statement block……");
}finally{
System.out.println("在try语句块中return你再强大,也影响不了我finally语句块的继续运行,嘿嘿……");
} } public static void main(String[] args) {
FinallyTest1 t=new FinallyTest1();
t.test();
}
} /*
运行结果:
Try statement block……
在try语句块中return你再强大,也影响不了我finally语句块的继续运行,嘿嘿…… 总结:
finally语句块的运行不会受到try语句块中的return的影响。 */

三、finally语句块不受return语句的影响。哪finally语句块究竟是在return之前还是之后运行?

public class FinallyTest2 {
private int test(){
int a=520;
try{
return a+=1314000;
}catch(Exception e){
System.out.println();
}finally{
System.out.println("Finally运行,a值为:"+a);
a=0;
System.out.println("小闹了一下(a=0),嘿嘿! ");
} return 250;
} public static void main(String[] args) {
FinallyTest2 t=new FinallyTest2();
System.out.println("方法返回(return) :"+t.test());
} }
/*
运行结果:
Finally运行,a值为:1314520
小闹一下(a=0),嘿嘿。
方法返回(return) :1314520 总结:
在try语句块中运行到了return时,并非马上返回而是把return要返回的值计算出来先保存到内存中,
然后去运行finally语句块。然后再返回之前保存要return的值。 */

四、在返回之前运行在finally块中的语句,哪finally块中也return会怎么样呢?

public class FinallyTest3 {
//@SuppressWarnings 批注同意您选择性地取消特定代码段(即,类或方法)中的警告。
@SuppressWarnings("finally")
private int test(){
try{
return 520;
}catch(Exception e){
System.out.println();
}finally{
return 5820; //此处return语句会产生警告
}
} public static void main(String[] args) {
FinallyTest3 t=new FinallyTest3();
System.out.println("方法返回(return) :"+t.test());
}
}
/*
执行结果:
方法返回(return) :5820 总结:
假设try和finally都有return 语句。则返回值以最后一个return语句的值作为返回,前面的一个被默认的牺牲啦。
*/

最新文章

  1. eclipse调试java程序的九个技巧
  2. SpringMVC流程
  3. start: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart:
  4. iOS - AVAudioPlayer 音频播放
  5. Android的onCreateOptionsMenu()创建菜单Menu详解
  6. .NET设计模式(6):原型模式(Prototype Pattern)
  7. Matplotlib中文显示的问题
  8. Struts2学习笔记③
  9. CSS3之background-origin
  10. Linux显示进程状态
  11. 通过Navicat连接MySQL数据库
  12. 纯css画直角三角形
  13. super 使用以及原理
  14. shell 2变量
  15. TortoiseGit 提交代码每次需要输入用户名和密码?
  16. go * 和 &的区别
  17. spark-submit配置说明
  18. 物联网PPT智能家居王思齐和陈由钧第10组
  19. extjs4权限管理,actioncolumn列显示隐藏或禁用
  20. #!/bin/sh简介

热门文章

  1. Oracle spool 用法小结
  2. [UOJ#219][BZOJ4650][Noi2016]优秀的拆分
  3. C++ 中的 C_str() 函数用法
  4. Moya 与 RxSwift 使用
  5. N皇后-位运算优化
  6. OI 数论整理
  7. css解析规则
  8. BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]
  9. linux的crontab定时任务命令
  10. 有关WebView开发问题(转)