关注“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 = "小泽";
        }
    }
}
`

运行下面这段代码,输入什么?

是"苍老师"还是"小泽"?

其实,对于java开发者来说,finally曾经是老熟人了。

有时候,程序在try块里关上了一些物力资源(比方:数据库连贯,网络连接、磁盘文件等),这些物力资源都是必须要咱们手动回收。

那就该它出场了---finally。

一个残缺的java异样解决构造如下:

`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里的代码块会执行。

  • 如果在try模块没有产生异样,那么代码失常执行结束,在执行finally模块。
  • 如果try模块产生异样并且被catch模块捕捉了,那么在catch模块内的代码执行完结后再执行finally模块。
  • 如果try模块中有异样并且没有catch模块或者没有被catch模块捕捉到,那么在异样被跑出去之前执行finally模块。

异样相干举荐这篇文章:

面试官:说说你对Java异样的了解

于是乎,很多人就认为答案是:小泽

运行代码,输入的竟然是:苍老师

是不是很懵逼?为什么是“苍老师”?

不焦急,上面咱们来好好剖析剖析。

咱们先通过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模块的关系。心愿大家不论是在工作中还是面试都能轻松应答。

没有学不好的技术,只有不爱学习的人~

举荐浏览

《垃圾回收的算法与实现》.pdf

田哥:面试被问== 与equals 的区别,该怎么答复?

7种启动Spring Boot我的项目的形式,一次性打包说给你听