Java异常处理-5-finally相关面试题

       这篇介绍两个关于finally的面试题,第一个是概念题,就考察概念,因为两个英文单词很像。第二个是代码考察,特别注意return语句和finally之间执行先后顺序。


1.final 和finally 和finalize三者的区别

      三个单词看起来很接近,其实三个之间没有任何关系,记住下面三者概念就好办。

final可以修饰类和方法和变量。当修饰类的时候,不能被继承;当修饰方法的时候,不能被重写;当修饰变量的时候,变量只能赋值一次。

finally是try语句中的一个语句体,不能单独使用,用来释放资源的

finallize是Object这个类中的一个方法,是垃圾回收器调用这个方法去处理垃圾回收。


2.如果catch语句体有return语句,请问finally语句体还会执行吗?如果会,是先执行return还是先执行finally语句。

这个题目,我们用一个代码练习来解释。

package exception;

public class Demo1_Finally {
	
	public static void main(String[] args) {
		System.out.println(test1());
	}

	public static int test1() {
		int x = 10;
		
		try {
			x = 20;
			System.out.println(10/0);
			return x;
		} catch (Exception e) {
			x = 30;
			return x;
		} finally {
			x = 40;
			
		}
		
	}

}

       运行之后,结果是30. 解释一下,因为上面打印语句执行了10/0,出现了异常,所以try中的return x没有执行,直接跳转到catch中执行了x = 30这行代码,然后继续执行return 30. 这样要注意,这里return x(x=30),没有完整返回,结束整个方法,而是把这个返回相当于存储在一个临时变量进行保存。然后会继续执行finally语句块,这个时候x=40也执行了。但是这个x和catch中返回的已经没有了关系,这个时候回过头来执行catch中的返回语句,从临时变量去拿出返回的值去返回,所以结果是30.

       这个题目的答案就是,会执行finally语句,而且是先执行return语句,但是没有结束,然后去检查有没有finally,发现有就去执行finally语句,最后回来完成返回语句。


猜你喜欢

转载自blog.csdn.net/u011541946/article/details/80787846
今日推荐