前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【面试八股文】每日一题:谈谈你对异常的理解

【面试八股文】每日一题:谈谈你对异常的理解

作者头像
用户4919348
发布2023-08-11 16:05:51
1650
发布2023-08-11 16:05:51
举报
文章被收录于专栏:波波烤鸭波波烤鸭

https://www.bilibili.com/video/BV1oX4y1Y7xG?t=9.0

每日一题-Java核心-谈谈你对异常的理解【面试八股文】

  异常是程序在运行过程中出现的错误或不正常的情况。当程序执行过程中遇到无法处理的错误或者不符合预期的情况,就会抛出异常。异常可以分为两种类型:受检异常非受检异常

受检异常是指在程序编译过程中就能被检测到的异常,需要在代码中进行明确的处理,否则编译不通过。例如,文件不存在、网络连接失败等情况都属于受检异常。

非受检异常是指在程序运行过程中出现的异常,无法在编译时被检测到。这些异常通常是由程序逻辑错误导致的,如空指针引用、数组越界等。非受检异常可以通过捕获和处理来避免程序的崩溃。

异常处理是为了在程序出现异常时能够进行相应的处理,避免程序的异常终止。常用的异常处理方式包括捕获异常、抛出异常和处理异常。捕获异常通过try-catch语句块来实现,可以在catch块中对异常进行处理,如输出错误信息、记录日志等。抛出异常通过throw语句将异常传递给上层调用者来处理。处理异常可以通过finally块来执行一些无论是否发生异常都需要执行的代码。

异常处理目的保证程序稳定性可靠性。良好的异常处理可以提高程序的健壮性,增强程序的容错性,并能够更好地定位和解决问题。同时,合理的异常处理也能提高程序的可读性和可维护性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1HQ9693-1691657117410)(E:\课程更新录制\08-面试专题\01-课件资料\img\Java异常.png)]

return和finally的顺序问题

  分析如下的代码程序,给出输出结果,并给出原因

代码语言:javascript
复制
public class Demo02 {
    public static void main(String[] args) {
        Demo02 demo02 = new Demo02();
        System.out.println(demo02.getName("bobo"));
    }

    public String getName(String name){
        String res = "";
        try {
            res = name;
            return  res;
        }finally {
            res = "波波烤鸭";
        }
    }
}

  输出的结果是:bobo

  原因:通过指令分析我们可以发现在 return 代码执行的时候会将局部变量保存在 栈帧的顶部,然后在finally中修改的还是原来的栈帧位置的局部变量,最终返回的信息还是栈帧顶部的变量,所以finally代码块在return关键字之后会执行,但是不会改变栈帧顶部的信息。

指令分析

  首先我们要清楚在jvm中,每个线程都具有自己的虚拟机栈。当执行方法时,如上面的getName,就会创建一个栈帧(存储局部变量表,操作数栈等信息)进入虚拟机栈。每一个方法从调用到执行完毕,就是一个栈帧从虚拟机栈中入栈到出栈的过程。对应的栈帧情况为

在这里插入图片描述
在这里插入图片描述

ldc:将int,float或者String类型常量从常量池推送至栈顶。 astore:将栈顶引用型类型数据存入指定本地变量。 aload:将制定的引用类型变量推送至栈顶

查看关键的指令为:

请添加图片描述
请添加图片描述

还有一种情况需要注意,如果finally和try块中都有return关键字会怎么样呢?

代码语言:javascript
复制
public class Demo02 {
    public static void main(String[] args) {
        Demo02 demo02 = new Demo02();
        System.out.println(demo02.getName("bobo"));
    }

    public String getName(String name){
        String res = "";
        try {
            res = name;
            return  res;
        }finally {
            res = "波波烤鸭";
            return res; // 指令中返回的就不是栈帧顶部的数据了 而是 res 对应的栈帧位置
        }
    }
}
请添加图片描述
请添加图片描述

  通过指令我们可以看到在finally中的return关键字的指令返回的就是finally中的局部变量的信息,可以理解为finally中的return会覆盖掉try块中的return逻辑。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档