博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈finally使用坑。
阅读量:7101 次
发布时间:2019-06-28

本文共 3872 字,大约阅读时间需要 12 分钟。

  hot3.png

#finally

  • 在异常处理时提供 finally 块来执行任何清除操作。只有在与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
    • finally 语句块可能是要执行的。

      • 当try流程中出现程序中断情况是不会在执行finally语句的。也就是说一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。
    • finally 对应的try catch语句中出现控制转移语句会咋样?

      public static void main(String[] args)  {        try {              System.out.println("try block");              return ;          } finally {              System.out.println("finally block");          }       } 	//运行结果	//try block 	//finally block

      从结果看finally语句会在return之前执行。

      public static void main(String[] args)  {    System.out.println("return value of test(): " + test()); }public static int test() {     int i = 1;	try {  		System.out.println("try block");        i = 1 / 0; //抛一个异常进catch	    return i;  	}catch (Exception e){ 		System.out.println("exception block"); 		return 2; 	}finally {  		System.out.println("finally block");  	} }  //运行结果//try block//exception block//finally block//return value of test(): 2

      从结果看finally 语句块在 catch 语句块中的 return 语句之前执行。

      public static void main(String[] args)  {    System.out.println("return value of test(): " + test()); }@SuppressWarnings("finally")public static int test() { 	 int i = 1;       try {         	i = 4;         	return i;      } finally {         	i++;         	return i;       }  } //运行结果//return value of test(): 5

      从结果看 finally 语句块中如果出现return那么该流程就结束了。其实是finally块中的return语句会覆盖try块中的return返回。

      public static void main(String[] args)  {    System.out.println("return value of test3(): " + test()); } public static int test3() { 	int b = 20; 	try { 		System.out.println("try block"); 		b += 80; 		return b;  	} catch (Exception e) { 		System.out.println("catch block"); 	} finally { 		System.out.println("finally block"); 		if (b > 25) { 			b += 100; 			System.out.println("b>25 and b = " + b); 		} 	} 	return b; } // 运行结果//try block//finally block//b>25 and b = 200//return value of test(): 100

      从结果看:weary:为什么不返回200!为什么finally里面的修改没有效果?因为finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。那什么情况下会改变呢?

      public static void main(String[] args)  {    System.out.println("return value of test3(): " + test());   } public static int test3() {        int b = 20;        try {            System.out.println("try block");            b += 80;            b = b / 0; //抛异常            return b;         }        catch (Exception e) {            System.out.println("catch block");        }        finally {            System.out.println("finally block");            if (b > 25) {            	b += 100;                System.out.println("b>25 and b = " + b);            }        }        return b; } //运行结果 //try block //catch block //finally block //b>25 and b = 200 //return value of test(): 200

      从结果看finally里面的修改启效果了,因为抛出了异常所以没有执行try代码块里面的return。

      public static void main(String[] args)  {   	 	System.out.println("return value of test3(): " + test());     }    public static int test3() {    	int b = 20;	        try {	            System.out.println("try block");	            b += 80;	            b = b / 0;	            return b; 	        }	        catch (Exception e) {	            System.out.println("catch block");	            return b += 10;	        }	        finally {	            System.out.println("finally block");	            if (b > 25) {	            	b += 100;	                System.out.println("b>25 and b = " + b);	            }	        }   }// 运行结果// try block// catch block// finally block// b>25 and b = 210// return value of test(): 110

​ 从结果来看,抛出异常后return 方法执行之前,也运行了finally代码块,但是并未影响catch代码块中的返回值。

  • 总结下:finally块的语句在try或catch中的return语句执行之后返回之前执行,且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。最后没有进入try代码块就不会执行finally代码块。。

转载于:https://my.oschina.net/z201/blog/1239953

你可能感兴趣的文章
对Docker的了解,你能读懂多少?
查看>>
PHP Socket 网络编程
查看>>
关于数据库事务并发的理解和处理
查看>>
SQL基本增删改查语句
查看>>
Android Notification
查看>>
vue+vant同一项目实现豆瓣电影加网易云音乐webapp-最佳练手项目
查看>>
tty的求助
查看>>
钱包开发数字货币钱包开发虚拟币多币种钱包开发
查看>>
spring cloud互联网分布式微服务云平台规划分析--spring cloud服务统一配置中心
查看>>
【Flask】关于request.json /.values /.args /.form
查看>>
Virtualbox虚拟Ubuntu共享文件夹设置
查看>>
ubuntu上安装lua
查看>>
完全检查点与增量检查点的区别
查看>>
rhel5.4安装oracle10g图文步骤1
查看>>
未能加载文件或程序集“AspNetPager”或它的某一个依赖项。参数错误。
查看>>
Java之JVM内存结构、Java内存模型、Java对象模型
查看>>
distribute-list分发列表详解
查看>>
关于Oracle归档进程的运行机制
查看>>
mail退信分析大全
查看>>
grep命令以及正则表达式,算数运算.
查看>>