在Java面试中,出现关于finally的面试问题的概率非常高,而且如果被面试官问到,就不会翻筋斗,而是会接二连三地提出“连环提问”。 而且,回答这一系列问题常常需要代码的辅助,可以说是考验基础的面试的有利问题。 面试官会问什么呢? 应试者应该如何完美地回答呢? 今天主编带着猴子们体验finally面试,希望对你有帮助。
假设发生3360异常后,不执行异常后的代码,而是在catch块中执行,但要理解catch后的代码是执行的。 简单示例3360
公共静态测试() try ) intI=1/0;
系统. out.println (error open ); //上面发生了异常,所以我永远不去这里
返回'1';
}catch(arithmeticexceptione ) )
系统. out.println (error );
}
system.out.println (try . catch . finish ); 返回'完成';
}
结果:
错误发生器
try . catch . finish
面试官的主题
什么时候用finally? finally语句是否在try或catch return语句执行后或return返回前执行?
考点分析
这个主题也与异常相关。 对于这个主题,我们用代码验证我们的答案。 因为有异议的知识点,所以代码最有说服力。 关于编程,希望你记住“不要和人争,一切都用代码说”。
回答
什么时候用finally?
有些需要在异常处理后恢复到原始状态,如打开的文件、网络连接等。
finally语句是否在try或catch return语句执行后或return返回前执行?
这个问题是非常经典的问题,经常被面试官问。 如果不亲自实验的话,可能会判断错误。 让我们结合代码进行分析。
以下,用4个demo得出最终结论。
1
私密静态int test1 (
int i=1;
try {
system.out.println('try . ';
返回I=10;
}catch(exceptione ) {
system.out.println('catch . ';
} finally {
I;
system.out.println('finally . ';
system.out.println(I=) I;
}
返回I;
}
执行结果:
特里.
金融.
i=12
test1:11
总结: finally代码块在try代码块中的return语句执行后返回执行。
2
私密静态int test2(
int i=1;
try {
system.out.println('try . ';
返回I=10;
}catch(exceptione ) {
system.out.println('catch . ';
} finally {
I;
system.out.println('finally . ';
system.out.println(I=) I;
返回I;
}
}
执行结果:
test2:12
特里.
金融.
i=12
总结: finally代码块中的return语句将复盖try代码块中的return语句。
3
私有静态地图测试3 (
Map map=new HashMap (;
map.put(key,) INIT );
try {
system.out.println('try . ';
map.put(key,) TRY );
返回图;
}catch(exceptione ) {
system.out.println('catch . ';
map.put(key,) CATCH );
} finally {
system.out.println('finally . ';
map.put(key,) FINALLY );
映射=null;
}
返回图;
}
执行结果:
特里.
金融
金融.
总结:如果return语句未复盖finally语句中的返回值,则原始返回值可能会通过在finally中的修改而更改,也可能不会更改。 值类型返回值:不变; 传输目标类型的返回值:变化。
在这里引入新问题,如何判断变量是传递值还是传递地址? 传值: 8种基本数据类型及其包装类、文字常数。 地址:数组和对象。
4
私密静态int test4(
int i=1;
try {
system.out.println('try . ';
i=i/0;
返回I=10;
}catch(exceptione ) {
system.out.println('catch . ';
返回I;
} finally {
I;
system.out.println('finally . ';
system.out.println(I=) I;
}
}
执行结果:
特里.
广告宣传.
金融.
i=2
1
总结: try代码块中的return语句不在异常情况下执行,具体返回哪一个进行观察; catch上的返回执行情况与未发生异常时try上的返回执行情况完全相同。
情况:
私密int test5() {int i=1; try{
system.out.println('try . ';
i=i/0; 返回I=10;
}catch(exceptione ) {
system.out.println('catch . '; returni;
}finally{
I;
system.out.println('finally . ';
system.out.println(I=) I; returni;
}
}
特里.
广告宣传.
金融.
i=2
2
将:finally代码块中的return语句放在一起,以复盖try代码块中的return语句。
总结一下
根据以上分析,总结一下答案吧:
不执行try语句。 如果在try语句之前返回,则不执行finally语句。 因此,finally语句需要执行而不是充分条件表明相应的try语句必须执行。
在try代码块中执行system.exit(0)语句时; 由于Java虚拟机JVM将退出,因此finally语句也不会在中执行。
finally块语句在执行try或catch return语句后、返回值前执行。 此外,finally修改语句可以影响也可以不影响try或catch返回中已经确定的返回值。 如果返回类型为寻址类型,则会产生影响。 传递值类型不会产生影响。 如果finally也有return语句,则重写try或catch return语句并直接返回。