下午群里的小伙伴发了一倒面试题
- 对于这个问题,该是什么了,有的人说是int try,有的说是finally,有的说的两个都输出,那么正确答案是什么了?
Java 异常
异常处理
try{
//可能发生异常
}catch(Exception e){
//捕获异常
}finally{
// 有无异常都会执行
}
finally 中的代码有以下情况
- 1 没有异常发生,在try结束后执行
- 2 有异常发生并被捕获,在catch执行后执行
- 3 有异常发生但没有捕获,则异常在被抛给上层之前执行
return
public static int anInt() {
int ret = 0;
try {
return ret;
} finally {
ret = 2;
}
}
结论:这个函数返回值是0,而不是2,因为函数执行到try内return语句之前,会将返回值保存到一个临时变量中,然后执行finally语句,最后在返回那个临时变量,即finally对ret的修改不会生效
return
public static int anInt() {
int ret = 0;
try {
int a = 10 / 0;
return ret;
} finally {
ret = 2;
}
}
结论: 输出2
原因a = 10 / 0 会抛出ArithmeticException,finally中有return不仅会覆盖try和catch的值,还会掩盖try和catch的异常
return
public static int anInt() {
int ret = 0;
try {
int a = 10 / 0;
return ret;
} finally {
throw new NullPointerException("NullPointerException");
}
}
finally中异常会覆盖try和catch的异常
面试题答案
规则3,既只会输出finally
本文使用 mdnice 排版