在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. 老式浏览器支持html5和css3

    在IE页面的head标签里面加入   <!-[if IE]> <script src="http://html5shiv.googlecode.com/svn/trunk/ ...

  2. python 使用 Pyscript 调试 报错

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 13-16: ordinal not in range(12 ...

  3. Android学习笔记(十三) Handler

    可用于解决上一则笔记所提到的WorkerThread无法修改UI控件的问题 一.Handler.Looper和MessageQueue的基本原理 Handler把消息对象放到MessageQueue当 ...

  4. git创建分支及日常使用

    克隆代码 git clone https://github.com/master-dev.git 查看所有分支 git branch --all # 默认只有master分支,所以会看到如下两个分支 ...

  5. Asp.Net 设计模式 之 “特殊”的单例模式

    特殊的单例模式 要点在这里,提前预览: public SingleDemo() { name = "yy"; age = 20; //特殊的单例,this指代得失当前的Single ...

  6. Winform中ListView鼠标移动使用toolTip显示信息

    今天在做一个酒店管理系统的时候用到了ListView,突然想到是否能够当鼠标移动到某一项的时候给出具体房间的信息呢! 首先设置Listview的MouseMove事件 1.获取当前坐标的项 ListV ...

  7. Matlab plotyy画双纵坐标图实例

    Matlab plotyy画双纵坐标图实例 x = 0:0.01:20;y1 = 200*exp(-0.05*x).*sin(x);y2 = 0.8*exp(-0.5*x).*sin(10*x);[A ...

  8. 利用nginx与nginx-rtmp-module搭建流媒体服务器实现直播

    使用环境是centos 7.0+nginx:可以实现简单的流媒体服务. 先下载nginx-rtmp-module拓展: nginx-rtmp-module的官方github地址:https://git ...

  9. 00C#

    C# C#(读作“See Sharp”)是一种简单.现代.面向对象且类型安全的编程语言.C# 起源于 C 语言家族,因此,对于 C.C++ 和 Java 程序员,可以很快熟悉这种新的语言.C# 已经分 ...

  10. 复制Windows的等宽字体到Linux

    1.从Windows的Fonts目录下复制字体 2.在Linux的/usr/share/fonts目录下创建子目录例如:sudo mkdir /usr/share/fonts/win 3.复制字体到该 ...