2024 Java 异常—面试常见问题

目录

一、异常的分类

二、throw和throws都是异常处理的关键字,二者区别。

三、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

四、try-catch-finally 中哪个部分可以省略?

五、常见的 RuntimeException 有哪些?

六、Error 和 Exception 区别是什么?

运行时异常

编译时异常


一、异常的分类

 Java中异常处理的两种方式:(Ctrl + alt + t)

Throwable 是 Java 语言中所有错误与异常的超类。

Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。

Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。

try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。

catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。

finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。

异常出现,throw出来,程序应该就中断了,也不会往下执行。

        通常情况下,如果没有捕获到异常,方法会提前结束并返回错误代码而不是整个程序。这意味着方法无法正常完成任务,并且通过返回错误代码来指示调用方发生了错误。当方法遇到错误或异常情况时,它将停止执行代码并立即返回给调用方。程序虽然将继续执行,但方法已经提前结束了。调用方可以根据方法返回状态进行相应的处理和错误处理。程序将正常退出,但是返回的错误代码不是0,而是表示具体出错情况的其他值。这样,调用方可以根据返回的错误代码进行相应的处理和错误处理。

二、throwthrows都是异常处理的关键字,二者区别。

  throw关键字用于手动抛出一个异常对象。当程序执行到throw语句时,会立即停止当前的执行路径,并将异常对象传递给调用栈中的上层异常处理机制。throw通常用于在代码中主动抛出异常,例如:

throw new IllegalArgumentException("Invalid argument");

  throws关键字用于声明方法可能抛出的异常类型。当一个方法可能引发异常但不处理时,可以使用throws关键字在方法签名中列出可能抛出的异常类型。这样做的目的是向方法的调用者明确表明该方法可能会产生异常,需要进行相应的异常处理。例如: 

public void readFile() throws IOException { // 读取文件的代码 }

在上面的例子中,readFile()方法声明了可能抛出IOException异常,调用该方法的代码需要进行相应的异常处理,例如使用try-catch块来捕获异常或者继续使用throws关键字将异常向上层抛出。

总结一下:

  • throw用于手动抛出一个异常对象。
  • throws用于在方法签名中声明可能抛出的异常类型,以便通知,声明调用者进行相应的异常处理。

三、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?


答:会执行,在 return 前执行。

注意:在 finally 中改变返回值的做法是不好的,如果存在 finally 代码块,try中 return 语句不会立马返回调用者,而是记录下返回值待 finally 代码块执行完毕之后再向调用者返回其值,然后如果在 finally 中修改了返回值,就会返回修改后的值。显然,在 finally 中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java 中也可以通过提升编译器的语法检查级别来产生警告或错误。

@SpringBootTest
class MyclocksourceApplicationTests {@Testvoid contextLoads() {getInt();}public static int getInt() {int a = 10;try {System.out.println(a / 0); // 这行代码会抛出一个 ArithmeticException 异常a = 20; // 这行代码永远不会被执行,因为上面那行会抛出异常} catch (ArithmeticException e) {a = 30;return a; /*当执行到 return a 时,return 的值实际上是 30。虽然方法要返回,但 finally 块仍会执行。*/
//return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
//但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
//再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30} finally {a = 40; // 修改变量 a 的值,但不会影响已经准备返回的值
// 但 return 30 的返回路径已经确定}System.out.println(a); // 这行代码永远不会被执行return a; // 这行代码也永远不会被执行}
}
  • 尽管 finally 块将 a 修改为 40,但是因为在 catch 块中已经准备返回 30,这个返回值不会被修改。最终返回的值是 30。
  • 但如果按照下面这样的方式去写,则会:
    public static int getInt() {int a = 10;try {System.out.println(a / 0);a = 20;} catch (ArithmeticException e) {a = 30;return a;} finally {a = 40;
//如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40System.out.println(a);return a;}}

        在 Java 中,finally 块中的 return 语句会覆盖 trycatch 块中的 return 语句。也就是说,如果在 finally 块中有一个 return 语句,那个 return 语句将会成为最终的返回路径,无论之前的 return 语句是什么。 故执行结果:40

四、try-catch-finally 中哪个部分可以省略?

答:catch 可以省略

原因

更为严格的说法其实是:try只适合处理运行时异常,try+catch适合处理运行时异常+普通异常。也就是说,如果你只用try去处理普通异常却不加以catch处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以catch可以省略,你加上catch编译器也觉得无可厚非。

理论上,编译器看任何代码都不顺眼,都觉得可能有潜在的问题,所以你即使对所有代码加上try,代码在运行期时也只不过是在正常运行的基础上加一层皮。但是你一旦对一段代码加上try,就等于显示地承诺编译器,对这段代码可能抛出的异常进行捕获而非向上抛出处理。如果是普通异常,编译器要求必须用catch捕获以便进一步处理;如果运行时异常,捕获然后丢弃并且+finally扫尾处理,或者加上catch捕获以便进一步处理。至于加上finally,则是在不管有没捕获异常,都要进行的“扫尾”处理。

五、常见的 RuntimeException 有哪些?


ClassCastException(类转换异常)

IndexOutOfBoundsException(数组越界)

NullPointerException(空指针)

ArrayStoreException(数据存储异常,操作数组时类型不一致)

还有IO操作的BufferOverflowException异常

六、Error 和 Exception 区别是什么?


Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,JAVA 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复;

通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。

这些错误是不受检异常,非代码性错误。因此,当此类错误发生时,应用程序不应该去处理此类错误。按照Java惯例,我们是不应该实现任何新的Error子类的!

Exception 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。

Exception 这种异常又分为两类:运行时异常和编译时异常。

运行时异常

定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。

特点:Java 编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。比如NullPointerException空指针异常、ArrayIndexOutBoundException数组下标越界异常、ClassCastException类型转换异常、ArithmeticExecption算术异常。

此类异常属于不受检异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。虽然 Java 编译器不会检查运行时异常,但是我们也可以通过 throws 进行声明抛出,也可以通过 try-catch 对它进行捕获处理。如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

RuntimeException 异常会由 Java 虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。

编译时异常

定义: Exception 中除 RuntimeException 及其子类之外的异常。

特点: Java 编译器会检查它。如果程序中出现此类异常,比如 ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。该异常我们必须手动在代码里添加捕获语句来处理该异常。

RuntimeException异常和一般异常(受检异常)之间的区别:是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常(RuntimeException)。一般来讲,如果没有特殊的要求,我们建议使用RuntimeException异常。

可以根据下图来选择是捕获异常,声明异常还是抛出异常

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

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

相关文章

反悔贪心,LeetCode 2813. 子序列最大优雅度

一、题目 1、题目描述 给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi],其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_categories2 计算…

.pkl文件保存和读取

#save sim sim.save(G:/simulation.pkl) print()#read sim import pickle with open(G:/simulation.pkl, rb) as f:sim pickle.load(f)

BarTender软件下载附加详细安装教程

BarTender是美国海鸥科技推出的一款优秀的条码打印软件,应用于 WINDOWS95 、 98 、 NT 、 XP 、 2000 、 2003 和 3.1 版本, 产品支持广泛的条形码码制和条形码打印机, 不但支持条形码打印机而且支持激光打印机,还为世界知名品牌条…

C脚本实现用键盘按键控制Wincc某按钮动作

文章目录 前言一、创建Wincc画面并添加变量及按钮二、在“事件”-“键盘”下,编写“按下”和“释放”的C脚本 前言 在某些特定场景下,需要通过电脑键盘控制上位机界面上按钮按下或释放,本文给出了基于C脚本的解决方案。 一、创建Wincc画面并…

Python中Numpy的np.arange

np.arange 是用于创建等差整数序列的函数。其语法如下: np.arange(start, stop, step, dtypeNone) start:序列的起始值,默认为0。 stop:序列的终止值,生成的数组不包括此值。 step:序列中的值之间的步长&a…

Tailwind CSS 响应式设计实战指南

title: Tailwind CSS 响应式设计实战指南 date: 2024/6/13 updated: 2024/6/13 author: cmdragon excerpt: 这篇文章介绍了如何运用Tailwind CSS框架创建响应式网页设计,涵盖博客、电商网站及企业官网的布局实例,包括头部导航、内容区域、侧边栏、页脚…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战十一(整体布局04之Header及用户注销)

新增Hearder 新增 src/layout/components/PageHeader.vue <template><div class"header-cont"><div><h1><router-link to"/">RealWorld</router-link></h1></div><div><template v-if"is…

北斗三号短报文终端户外应急通信解决方案

北斗三号短报文终端户外应急通信解决方案主要基于我国自主研发的北斗三号全球卫星导航系统&#xff08;BDS-3&#xff09;&#xff0c;为户外应急场景提供高效、稳定的通信服务。以下是对该解决方案的详细阐述&#xff1a; 一、方案概述 北斗三号短报文终端户外应急通信解决方…

MapperStruct拷贝数据的介绍和使用

1、前言 在java 编程中&#xff0c;对象直接拷贝是很常用的方法&#xff0c;最初我们常用spring提供的拷贝工具BeanUtils的copyProperties方法完成对象之间属性的拷贝。但是它有几个明显的如下缺点 1、属性类型不一致导致摸一个属性值拷贝失败 2、通一个字段使用基本类型和包…

【html5的video标签在移动端的使用】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用步骤1. html部分2.js部分三、video相关文章推荐 前言 在移动端的首页用视频做背景动画&#xff0c;让动画循环&#xff0c;自动播放&#xff0c;静音。…

数据结构之链表的经典笔试题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 203. 移除链表元素 206. 反转链表 876. 链表的中间节点 面试题 02.02. 返回倒数第k个节点 …

Spring Boot整合Knife4j-3.0.3

文章目录 Spring Boot整合Knife4j-3.0.31. 引言2. 快捷的解决方案2.1 修改knife4j的依赖2.2 application.yml增加配置3.3 SwaggerConfig配置如下 Spring Boot整合Knife4j-3.0.3 1. 引言 前面我写过一篇关于整合knife4j的文档 Spring Boot整合Knife4j-2.0.7 最近我引入redissi…

【AI】文心一言的使用分享

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展正在改变我们的生活。文心一言&#xff0c;作为这一浪潮中的佼佼者&#xff0c;以其卓越的自然语言处理能力和广泛的应用场景&#xff0c;给我带来了前所未有的使用体验。在这篇分享中&#xff0c;我…

Spring Cloud Bus 消息总线基础入门与实践总结

【1】基础介绍 其主要是实现分布式自动刷新配置功能&#xff0c;Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架&#xff0c;它整合了Java的事件处理机制和消息中间件的功能…

ES的高可用

es最小高可用集群组成 At least three master-eligible nodes&#xff08;至少三个符合主节点条件的节点&#xff09;At least two nodes of each role&#xff08;每个角色至少有两个节点&#xff09;At least two copies of each shard (one primary and one or more replica…

Wall国内开源程序照片墙,支持VR全景及安装教程

下载 GitHub官网&#xff1a;https://github.com/zhang-tong-yao/wall 软件下载&#xff1a;https://github.com/zhang-tong-yao/wall/releases&#xff0c;推荐下载最新的版本。 演示效果 目前支持PC端和移动端自适应。 演示地址&#xff1a;https://demo-wall.ityao.cn …

在Vue 3中,el-select循环el-option的常见踩坑点,value值绑定对象类型?选中效果不准确?

在Vue 3中&#xff0c;el-select 组件是来自 Element Plus UI 库的一部分。 如果你想要设置默认选中的选项&#xff0c;你可以使用 v-model 来绑定选中的值。如果你想要在某个时刻让某个选项显示为已选中&#xff0c;可以设置对应的值到 v-model 绑定的数据。 <template>…

Android 10.0 framework层禁止扫描5g wifi功能实现

1.前言 在10.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持2.4g网络,所以需要在wifi扫描的过程中 禁止扫描5g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能 2.framework层禁止扫描5g wifi功能实现的核心类 frameworks/opt/net/w…

TrinityCore启动报错: MySQL library version (8.0.37 id 80037) does not match

TrinityCore启动的时候报错&#xff1a; TrinityCore/src/server/database/Database/DatabaseWorkerPool.cpp:73 in DatabaseWorkerPool FATAL ERROR: Used MySQL library version (8.0.37 id 80037) does not match the version id used to compile TrinityCore (id 80036). S…

农产品商城系统农资电商商城系统java项目jsp web项目

农产品商城系统农资电商商城系统java项目jsp web项目 会员用户可以实现&#xff1a;注册登录、商品信息浏览、加入购物车、加入收藏、下单支付、查看公告、查看以及留言、个人信息管理 后台管理的实现&#xff1a;类别管理模块、商品管理模块、会员管理模块、订单管理、退货管…