乐趣区

关于java:这道面试题出错率90

关注“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 我的项目的形式,一次性打包说给你听

退出移动版