在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语句。

 

汇总

根据上面的分析,咱们来汇总一下答案:

    1. try语句没有被执行,如在try语句之前就返回了,这样finally语句就不会执行;因此说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。

    2. 如果在try代码块中执行System.exit(0)语句;那么将终止Java虚拟机JVM,因此,finally语句也不会被执行到。

    3. finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中return已经确定的返回值,如果返回值类型为传址类型,则影响;传值类型,则不影响。若finally里也有return语句则覆盖try或catch中的return语句直接返回。

Java高概率面试题目—finally的更多相关文章

  1. 2018年4月份,阿里最新的java程序员面试题目,仅供参考。

    目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术面试1 1.Java I ...

  2. Java高质量面试总结

    面试 一般都是由浅到深去问,思路是: 先考察基础是否过关,因为基础知识决定了一个技术人员发展的上限 再通过深度考察是否有技术热情和深度以及技术的广度 同时可能会提出一些质疑和挑战来考察候选人能否与有不 ...

  3. Java高阶面试问题合集

    下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...

  4. java后端实习生面试题目

    1.编程题:java从10000到99999找到AABB类型 public class Test1 { public static void main(String[] args) { String ...

  5. Java集合框架面试题目

    1.为什么Map接口不继承Collection 接口? Set是无序集合,并且不允许重复的元素 List是有序的集合,并且允许重复的元素 而Map是键值对 它被视为是键的set和值的set的组合 Ma ...

  6. java 软件开发面试宝典

    一. Java 基础部分........................................................................................ ...

  7. 从菜鸟到大神:Java高并发核心编程(连载视频)

    任何事情是有套路的,学习是如此, Java的学习,更是如此. 本文,为大家揭示 Java学习的套路 背景 Java高并发.分布式的中间件非常多,网上也有很多组件的源码视频.原理视频,汗牛塞屋了. 作为 ...

  8. (转)面试大总结之一:Java搞定面试中的链表题目

    面试大总结之一:Java搞定面试中的链表题目 分类: Algorithm Interview2013-11-16 05:53 11628人阅读 评论(40) 收藏 举报 链表是面试中常出现的一类题目, ...

  9. 2020阿里Java面试题目大汇总,看看你离阿里还有多远,附答案!

    前言 首先说一下情况,我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿 ...

随机推荐

  1. 205 Isomorphic Strings 同构字符串

    给定两个字符串 s 和 t,判断它们是否是同构的.如果 s 中的字符可以被替换最终变成 t ,则两个字符串是同构的.所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字符不能映射到同一个字 ...

  2. vijos P1412多人背包 DP的前k优解

    https://vijos.org/p/1412 把dp设成,dp[i][v][k]表示在前i项中,拥有v这个背包,的第k大解是什么. 那么dp[i][v][1...k]就是在dp[i - 1][v] ...

  3. 转】R利剑NoSQL系列文章 之 Cassandra

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/3/ 感谢! R利剑NoSQL系列文章 之 Cassandr ...

  4. 【转】Nicescroll滚动条插件的用法

    原网址:http://blog.csdn.net/mss359681091/article/details/52838179 Nicescroll滚动条插件是一个非常强大的基于JQUERY的滚动条插件 ...

  5. Django model 反向引用中的related_name

    转自:https://blog.csdn.net/lanyang123456/article/details/68962515 问题: 定义表Apple: class Apple( models.Mo ...

  6. windows server 2008 r2 IIS7下网站配置 只允许指定的IP地址访问

    步骤一.找到ip地址和域限制 步骤二.添加全部拒绝 步骤三.添加允许访问的ip地址(局域网填写局域网ip,公网填写公网ip)  步骤四:如果想要拒绝某些ip访问,直接在规则中添加拒绝条目就可以  

  7. Node.js——基本服务开启

    标注模式 var http = require('http'); var server = http.createServer(); server.on('request', function (re ...

  8. [eclipse]的快捷键的设置

    今天新解压了一个eclipse,发现alt+/提示的快捷键不好用了,开始比较犯懒,但是发现开发效率低下,总结几个eclipse下快捷方式的解决办法. 第一个解决没有一点提示的情况. 1.首先通过菜单打 ...

  9. ZooKeeper系列(二)

    Zookeeper的环境配置 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. 1.单机模式:Zookeeper只运行在一台服务器上,适合测试环境 ...

  10. (转)淘淘商城系列——dubbo监控中心

    http://blog.csdn.net/yerenyuan_pku/article/details/72777623 之前我们就已学过了dubbo,想必大家对dubbo的架构有所了解,dubbo的架 ...