Java高概率面试题目—finally
在Java面试中关于finally的面试题目出现的概率非常高,而且一旦面试官问起绝不会是蜻蜓点水,而是会向你发起层层递进地“连环问”,并且回答这系列问题常常需要代码的辅助,可谓考验基础的面试利题。究竟面试官会问些什么呢?应试者又该怎样完美回答呢?今天小编就带着猿猿们亲身体验一场finally面试,希望对你有帮助。
前提需要了解:当发生异常之后,异常之后的代码不会执行,会到catch块中执行,但是catch之后的代码会执行,简单的例子:
public static String test(){
try {
int i=1/0;
System.out.println("error open");//上面发生异常,所以永远不会走这里
return "1";
} catch (ArithmeticException e) {
System.out.println("error");
}
System.out.println("try..catch...finish");
return "finish";
}
结果:
error
try..catch...finish
面试官题目
什么时候用到finally呢?finally语句在try或catch中的return语句执行之后,还是return返回之前执行呢?
考点分析
这个题目也是考查异常相关的。对于这个题目,我们通过代码来验证我们的答案,因为有异议的知识点,代码是最有说服力的。对于编程,希望你记住“不与人争辩,一切用代码说话”。
回答
什么时候用到finally呢?
某些事物(除内存外)在异常处理完后需要恢复到原始状态,如:开启的文件,网络连接等。
finally语句在try或catch中的return语句执行之后,还是return返回之前执行呢?
这个问题是一个很经典的问题,经常被面试官问,如果自己不去实验一下,可能判断就会出错。我们结合代码来分析一下。
下面我们通过4个demo来得出最终结论。
1
private static int test1() {
int i = 1;
try {
System.out.println("try...");
return i += 10;
} catch (Exception e) {
System.out.println("catch...");
} finally {
i++;
System.out.println("finally...");
System.out.println("i=" + i);
}
return i;
}
执行结果:
try...
finally...
i=12
test1:11
总结:finally代码块是在try代码块中的return语句执行之后,返回之前执行的。
2
private static int test2() {
int i = 1;
try {
System.out.println("try...");
return i += 10;
} catch (Exception e) {
System.out.println("catch...");
} finally {
i++;
System.out.println("finally...");
System.out.println("i=" + i);
return i;
}
}
执行结果:
test2:12
try...
finally...
i=12
总结:finally代码块中的return语句覆盖try代码块中的return语句。
3
private static Map<String, String> test3() {
Map<String, String> map = new HashMap<String, String>();
map.put("KEY", "INIT");
try {
System.out.println("try...");
map.put("KEY", "TRY");
return map;
} catch (Exception e) {
System.out.println("catch...");
map.put("KEY", "CATCH");
} finally {
System.out.println("finally...");
map.put("KEY", "FINALLY");
map = null;
}
return map;
}
执行结果:
try...
FINALLY
finally...
总结: 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。传值类型的返回值:不变;传址类型的返回值:会变。
这里引入来一个新的问题,怎么判断一个变量是传值还是传址?传值:8种基本数据类型及其包装类,字符常量。传址:数组和对象。
4
private static int test4() {
int i = 1;
try {
System.out.println("try...");
i = i / 0;
return i += 10;
} catch (Exception e) {
System.out.println("catch...");
return i;
} finally {
i++;
System.out.println("finally...");
System.out.println("i=" + i);
}
}
执行结果:
try...
catch...
finally...
i=2
1
总结: try代码块中的return语句在异常的情况下不会被执行,这样具体返回哪个看情况;catch中的return执行情况与未发生异常时try中return的执行情况完全一样。
- 第五种情况:
private int test5() {
int i = 1;
try {
System.out.println("try...");
i = i / 0;
return i += 10;
} catch (Exception e) {
System.out.println("catch...");
return i;
} finally {
i++;
System.out.println("finally...");
System.out.println("i=" + i);
return i;
}
}
try...
catch...
finally...
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中return已经确定的返回值,如果返回值类型为传址类型,则影响;传值类型,则不影响。若finally里也有return语句则覆盖try或catch中的return语句直接返回。
Java高概率面试题目—finally的更多相关文章
- 2018年4月份,阿里最新的java程序员面试题目,仅供参考。
目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术面试1 1.Java I ...
- Java高质量面试总结
面试 一般都是由浅到深去问,思路是: 先考察基础是否过关,因为基础知识决定了一个技术人员发展的上限 再通过深度考察是否有技术热情和深度以及技术的广度 同时可能会提出一些质疑和挑战来考察候选人能否与有不 ...
- Java高阶面试问题合集
下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...
- java后端实习生面试题目
1.编程题:java从10000到99999找到AABB类型 public class Test1 { public static void main(String[] args) { String ...
- Java集合框架面试题目
1.为什么Map接口不继承Collection 接口? Set是无序集合,并且不允许重复的元素 List是有序的集合,并且允许重复的元素 而Map是键值对 它被视为是键的set和值的set的组合 Ma ...
- java 软件开发面试宝典
一. Java 基础部分........................................................................................ ...
- 从菜鸟到大神:Java高并发核心编程(连载视频)
任何事情是有套路的,学习是如此, Java的学习,更是如此. 本文,为大家揭示 Java学习的套路 背景 Java高并发.分布式的中间件非常多,网上也有很多组件的源码视频.原理视频,汗牛塞屋了. 作为 ...
- (转)面试大总结之一:Java搞定面试中的链表题目
面试大总结之一:Java搞定面试中的链表题目 分类: Algorithm Interview2013-11-16 05:53 11628人阅读 评论(40) 收藏 举报 链表是面试中常出现的一类题目, ...
- 2020阿里Java面试题目大汇总,看看你离阿里还有多远,附答案!
前言 首先说一下情况,我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿 ...
随机推荐
- 229 Majority Element II 求众数 II
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 你的算法应该在O(1)空间中以线性时间运行. 详见:https://leetcode.com/problems/major ...
- Oracle分区表例子
分区表 Oracle提供的分区方法有以下几种. 1.范围分区(range) 范围分区是应用范围比较广的表分区方式,它是以列的值的范围来作为分区的划分条 件,将记录存放到列值所在的 range分区中. ...
- 面相切面编程AOP以及在Unity中的实现
一.AOP概念 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是 ...
- iOS programming Delegation and Text Input
iOS programming Delegation and Text Input 1.1 Text Fields CGRect textFieldRect = CGRectMake(40, ...
- vscode增加sftp扩展
下载 sftp-sync 扩展插件 填写配置 快捷键 ctrl+shift+P 打开指令窗口,输入sftp:config,回车,就会在当前工作工程的.vscode文件夹下生成一个sftp.json文件 ...
- mysql中int(1)与int(10)的区别
INT[(M)] [UNSIGNED] [ZEROFILL] 普通大小的整数.带符号的范围是-2147483648到2147483647.无符号的范围是0到4294967295. INT(1) 和 I ...
- Node.js——环境变量
- CREATE CONSTRAINT TRIGGER - 定义一个新的约束触发器
SYNOPSIS CREATE CONSTRAINT TRIGGER name AFTER events ON tablename constraint attributes FOR EACH ROW ...
- USB设备请求命令详解
USB设备请求命令 :bmRequestType + bRequest + wValue + wIndex + wLength 编号 值 名称 (0) 0 GET_STATUS:用来返回特定接收者 ...
- CAD参数绘制填充(com接口)
填充是CAD图纸中不可或缺的对象,在机械设计行业,常常需要将零部件剖开,以表现其内部的细节,而这些被剖开的截面会用填充来表示:在工程设计行业,一些特殊的材料或地形,也会用填充来表示. C#中实现代码说 ...