首页 > 其他 > 详细

finally的语句一定会被执行吗?

时间:2021-04-11 16:11:05      阅读:14      评论:0      收藏:0      [点我收藏+]

案例一如下:

		int[] num = { 1, 2, 3 };
		System.out.println(num[3]);
		try {
			System.out.println("try 代码块被执行!");
			return 0;
		} catch (Exception e) {
			System.out.println("catch 代码块被执行!");
			return 0;
		} finally {
			System.out.println("finally 代码块被执行!");

执行结果为:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at com.test.MyTest.myMethod(MyTest.java:15)
	at com.test.MyTest.main(MyTest.java:7)

==============
案例二如下:
在进入try-catch语句块之前,方法就已经return了的话,finally也不执行

更关键的是:即使进入了try-catch语句块。finally也可能不执行

  1. 比如:在try中执行这句话:
System.exit(0);
  1. 如果当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。

=======================

关于try-catch-finally之间的执行顺序

如果在finally中操作了变量,但是没有return语句保存结果的话,最终还是以try里面的变量和return语句为主

package com.test;
 
public class MyTest {
 
	public static void main(String[] args) {
 
		System.out.println("main 代码块中的执行结果为:" + myMethod());
	}
 
	public static int myMethod() {
 
		int i = 1;
		try {
 
			System.out.println("try 代码块被执行!");
			return i;
		} finally {
			++i;
			System.out.println("finally 代码块被执行!");
			System.out.println("finally 代码块中的i = " + i);
		}
 
	}
 
}

执行结果为:

try 代码块被执行!
finally 代码块被执行!
finally 代码块中的i = 2
main 代码块中的执行结果为:1

通俗的说就是:先会把try或者catch代码块中的返回值保留,再来执行finally代码块中的语句,等到finally代码块执行完毕之后,在把之前保留的返回值给返回出去。

finally的语句一定会被执行吗?

原文:https://www.cnblogs.com/zyk98/p/14643482.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!