1、这是一个经常面试到的面试题:
在finally代码前执行了return,那么finally里面的代码还会执行吗?是return前执行还是return后执行?
finally一般都是配合try catch一起使用,一般用作资源释放等,无论程序释放异常或者其他方式返回,只要虚拟机不退出(一般也不会发生)finally里面的代码始终都会执行。会在return前执行。
public static void main(String[] args){
int c = testReturn();
System.out.println("c=" + c);
}
private static int testReturn() {
int a = 10;
int b = 0;
int c = 0;
try {
c = a / b;
} catch (Exception e){
System.out.println("方法异常了!");
return 1;
} finally {
System.out.println("执行finally里面的代码了!");
}
return 2;
}
返回结果,说明finally里面的代码都会执行,并且在return前执行了:
方法异常了!
执行finally里面的代码了!
c=1
2、一个很少见的和finally相关的面试题:
请问以下代码的执行结果:
public static void main(String[] args){
int c = testFinally();
System.out.println("c=" + c);
}
private static int testFinally() {
int a = 10;
int b = 0;
int c = 0;
try {
c = a / b;
} catch (Exception e){
c = 1;
return c;
} finally {
c = 2;
}
return c;
}
代码执行结果:
c=1
很多人第一反应应该是c=2,其实不是,因为在catch里面已经将c赋值为1,并且return c;这个时候返回路径已经生成,也就说return c = return 1;这个时候finally里面将c赋值为2,改变不了返回的结果了。
3、final、finally、finalize的区别
1、final是java的关键字,表示不可变的意思,可以用来修饰类、变量和方法。final修饰的类不能被继承,final修饰的变量是常量,final修饰的方法不能被重写;
2、finally一般是结合try一起出现,finally里面的代码始终会执行,一般用作资源释放;
3、finalize是Object的方法,是调用垃圾回收机制的;