###前言:
在面试的时候总会出现各种各样的问题,有些是开发中不经常用到的。但是面试官总会问这些问题。
比如我们的异常处理这里 try...catch...finally 特殊用法
###面试题:
求运行函数返回的结果:
public static int getResult(){
try {
return 1;
} catch (Exception e) {
return 2;
}finally{
return 3 ;
}
}
####解题所需知识点:
1. 只有当try代码块发生异常的时候,才会执行到catch代码块
2. 不管try中是否发生异常,finally都会执行。
以下两种情况例外:
一:try中不发生异常时,try块中有System.exit(0);
二:try中发生异常时,catch中有System.exit(0);
说明:System.exit(0) 代码的作用的退出虚拟机;
3. 若finally块内有return语句,则以finally块内的return为准
说明:
如果try 或者 catch内也有return 其实是先执行了try 或者 catch代码块中的return语句的,
但是由于finally的机制,执行完try或者catch内的代码以后并不会立刻结束函数,还会执行finally块代码,
若finally也有return语句,则会覆盖try块或者catch块中的return语句
####解题:
1.首先,try块中的代码不会发生异常,所以不会执行到catch块的代码,即排除return 2 ;
2.执行完try块代码(虽然try块有return语句,但是由于finally机制,并不会直接退出函数),
接着执行finally块代码(finally块也有return语句,所以会覆盖掉try块的return语句),所以执行完该函数返回的结果为3 ;
####附加知识点:
1.若finally代码块中有return语句,则屏蔽cath代码块中抛出的异常
例如:
public static int getResult1() {
int i = 0;
try {
int c = 2 / i;
} catch (Exception e) {
i = 10;
throw e;
} finally {
i = 20;
return i;
}
}
说明:调用该函数不会发生异常,因为catch代码块内的throw e 语句抛出的异常被 finally代码块的return语句屏蔽了
本人博客:https://elfgirl.top/