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

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

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

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

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

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

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

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

return和finally的顺序问题

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

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关键字会怎么样呢?

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逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60729.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element组件浅尝辄止2:Card卡片组件

根据官方说法: 将信息聚合在卡片容器中展示。 1.啥时候使用?When? 既然是信息聚合的容器,那场景就好说了 新建页面时可以用来当做页面容器页面的某一部分,可以用来当做子容器 2.怎样使用?How? //Card …

Django实现音乐网站 ⑺

使用Python Django框架制作一个音乐网站, 本篇主要是后台对歌手原有实现功能的基础上进行优化处理。 目录 新增编辑 表字段名称修改 隐藏单曲、专辑数 姓名首字母 安装xpinyin 获取姓名首字母 重写保存方法 列表显示 图片显示处理 引入函数 路径改为显示…

rust关于项目结构包,Crate和mod和目录的组织

rust 最近开始学习rust语言。感觉这门语言相对java确实是难上很多。开几个文章把遇到的问题记录一下 rust关于包,Crate 关于包,Crate这块先看看官方书籍怎么说的 crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件…

2.4 网络安全新技术

数据参考:CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池,并按需自助获取和管理资源的模式。在云计算中,计算资…

谷粒商城第九天-解决商品品牌问题以及前后端使用检验框架检验参数

目录 一、总述 二、商品分类问题 三、前端检验 四、后端检验 五、总结 一、总述 在完成完商品分类的时候,后来测试的时候还是发现了一些问题,现在将其进行解决,问题如下: 1. 取消显示的时候,如果取消了显示&…

java+springboot+mysql校园通讯录管理系统

项目介绍: 使用javaspringbootmysql开发的校园通讯录管理系统,系统包含超级管理员、管理员、用户角色,功能如下: 超级管理员:管理员管理;部门管理;用户管理;留言管理;公…

OSI参考模型及TCP/IP协议栈

一、网络概述 1.1、什么是网络? 1、网络的本质就是实现资源共享 2、将各个系统联系到一起,形成信息传递、接收、共享的信息交互平台 1.2、典型的园区网拓扑 1.3、网络历史发展,ARPA和ARPANET 1、1969年,美国国防部高级研究计…

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点(golang/boomer) 问题 资料获取方法 背景 很早之前,考虑单机执行能力,使用locust做过公司短信网关的压测工作,后来发现了一个golang版本的locust,性能…

.netcore grpc一元方法详解

一、grpc服务端搭建 打开visual studio--》新建项目--》创建ASP.NET Core gRPC服务。 这里我是用的.NET 6.0做为底层框架,使用该框架支持grpc的功能更全面。令注使用nuget包Grpc.AspNetCore这里我使用的是2.40.0版本。 // 创建dollar.proto文件syntax "prot…

【Spring】使用注解存储Bean对象

目录 一、配置扫描路径(使用注解的方式存对象的前提) 二、使用类注解存储Bean对象 1、使用五大类注解存储Bean对象 2、为什么要这么多的类注解? 2.1、五大类注解之间的关系 3、获取Bean对象时的默认命名规则 三、使用方法注解来存储…

2020年12月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 执行语句print(10==10.0)的结果为? A:10 B:10.0 C:True D:False 正确的答案是 C:True。 解析:在Python中,比较运算符 “==” 用于比较两个值是否相等。在这个特定的比较中,整数10和浮点数10.0在数值上是相等的。…

Python学习笔记:List、Tuple、for循环

1.list list_demo [7, 7, 8, 9, 9, 9] print(list_demo.index(7)) # index 方法返回第一个index list_demo.sort() # 排序list list_demo.reverse() # 倒序list list_demo1 list_demo.copy() # 复制list 2.matrix 其实就是list嵌套&…