大多数公司针对初级、中级都会有笔试的这个环节,甚至不少高级面试也存在笔试环节。对于笔试你们千万不要掉以轻心,笔试题作很差,颇有可能面试就黄了或者随便找个面试官应付一下就能够回去等通知了。java
今天咱们分享的这个面试题,出现的频率是至关高。面试
咱们先上代码:数据库
public class TryFinallyDemo {
public static void main(String[] args) {
TryFinallyDemo tryFinallyDemo = new TryFinallyDemo();
System.out.println(tryFinallyDemo.test());
}
public String test() {
String name = "苍老师";
try {
return name;
} finally {
name = "小泽";
}
}
}
运行上面这段代码,输出什么?网络
是"苍老师"仍是"小泽"?ide
其实,对于java开发者来讲,finally已是老熟人了。学习
有时候,程序在try块里打开了一些物力资源(好比:数据库链接,网络链接、磁盘文件等),这些物力资源都是必需要咱们手动回收。url
那就该它出场了---finally。spa
一个完整的java异常处理结构以下:3d
public void test(){
try{
//业务代码
}catch(SubException e1){
//异常处理模块1
}catch(SubException e2){
//异常处理模块1
}finally{
//资源回收模块
}
}
为了保证必定能回收try模块中打开的物力资源,一场极致提供了finally模块。无论try模块中的代码是否异常,也无论是哪个catch被执行,甚至try或者catch模块中执行了return语句,finally模块总会被执行。日志
try、catch、finally三者的组合关系为:
在前面已经提到了,无论try里是否有异常,无论try或者catch是否有return语句,finally里的代码块会执行。
异常相关推荐这篇文章:
因而乎,不少人就认为答案是:小泽
运行代码,输出的竟然是:苍老师
是否是很懵逼?为何是“苍老师”?
不着急,下面咱们来好好分析分析。
咱们先经过javac编译,再经过javap命令查看看字节码内容。内容以下:
第一步:将"苍老师"放入操做栈中,而后将操做数栈中的数据保存在本地变量1中,将本地变量1放入操做数栈中,而后将操做数栈中的数据保存在本地变量2中。
第二步:将“小泽”放入操做栈中,而后将操做数栈中的数据保存到本地变量1中。
第三步:将本地变量2放入操做数栈中,将操做数栈中的数据返回。
因此上面的面试题,最终返回的是苍老师。
另外,若是在try模块出现异常,那么也是在finally模块执行完了再向外面抛出异常的。
public String test() {
String name = "苍老师";
try {
int a = 1/0;
return name;
} finally {
System.out.println("finally");
name = "小泽";
}
}
调用这个方法必然会出现异常:
从输出日志中能够看出,异常时在finally模块后执行。
例外
若是咱们在try模块代码中有下面这行代码,finally模块就不会执行了。
System.exit(0);
本文讲述了finally如何使用。以及哪些状况下finally模块会执行,哪些状况下不会被执行,finally模块和try模块的关系。但愿你们无论是在工做中仍是面试都能轻松应对。
没有学很差的技术,只有不爱学习的人~