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.rhkb.cn/news/348525.html

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

相关文章

华媒舍:15种媒体推广普遍不正确及解决方法

做为新闻媒体推广的重要一环,主流媒体推广在这个时代仍然发挥着重要的作用。由于种种原因,大家在主流媒体推广中常常做出各种各样不正确。为了能帮助广大推广工作人员们更好地进行主流媒体推广,本文可能详细介绍15种常见的错误,并…

PMP2024年新考纲有哪些变化?

在当前复杂多变的项目管理环境中,项目管理从业者在各种项目环境中工作,会采用不同的项目方法。PMP认证试图覆盖业界所有有效的项目管理方法, PMP考试范围包括传统的瀑布式开发模式等预测型生命周期的项目管理方法,也会考察敏捷或混…

[SWPUCTF 2022 新生赛]ez_1zpop(php反序列化之pop链构造)

[SWPUCTF 2022 新生赛]ez_ez_unserialize <?php class X {public $x __FILE__;function __construct($x){$this->x $x; }function __wakeup(){if ($this->x ! __FILE__) {$this->x __FILE__; }}function __destruct(){highlight_file($this->x);//flag is…

一文讲清:生产报工系统的功能、报价以及如何选择

最近这几年&#xff0c;企业越来越注重生产的速度和成本&#xff0c;尤其是“性价比”&#xff0c;生产报工系统已经变成了制造业里不可或缺的一部分。不过&#xff0c;市场上生产报工系统的选择太多&#xff0c;价格也都不一样&#xff0c;这就给很多企业出了个难题&#xff1…

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…

《人人都是产品经理》笔记1:什么是产品?怎么入行?

《人人都是产品经理》笔记1&#xff1a;什么是产品&#xff1f;怎么入行&#xff1f; 产品是什么&#xff1f;产品经理、产品管理&#xff1f;真的想做产品经理吗&#xff1f;全书结构示意图 从写这篇文章开始&#xff0c;是个人第二次对该书进行阅读&#xff0c;在此进行个人的…

Codeforces Global Round 26 E. Shuffle 【换根DP】

E. Shuffle 题意 给定一颗 n n n 个节点的树 T T T&#xff0c;现在要求恰好执行下面的程序操作一次&#xff1a; 从 T T T 中选择一个点&#xff0c;作为 T 2 T_2 T2​ 的新根节点将这个点从 T T T 中删除&#xff0c;现在 T T T 被分成了一个或一个以上的连通块树对每…

Python邮箱发送如何设置?Python发信方法?

Python邮箱发送邮件需要哪些库&#xff1f;怎么使用Python发信&#xff1f; Python的强大之处在于其丰富的库和模块&#xff0c;使得开发者可以轻松地实现各种功能&#xff0c;包括通过电子邮件发送信息。AokSend将介绍如何在Python中设置和发送电子邮件&#xff0c;以及相关的…

将bookmarks文件导入到edge浏览器

前情&#xff1a; 我的旧电脑上的浏览器保留很多书签&#xff0c;准备导入到新电脑上&#xff0c;于是将bookmarks文件拷贝了出来 方法&#xff1a; 网上的解决方案是将bookmarks文件后缀修改为.html&#xff0c;然后通过浏览器导入&#xff0c;但是尝试后并未成功 如图所示…

18. 四数之和 - 力扣

1. 题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0 …

免费数据库同步软件

在信息化日益发展的今天&#xff0c;数据同步成为了企业和个人用户不可或缺的一部分。数据库同步软件作为数据同步的重要工具&#xff0c;能够帮助我们实现不同数据库系统之间的数据复制和同步&#xff0c;确保数据的一致性和完整性。本文将介绍几款免费数据库同步软件&#xf…

用“引用“作形参,实现两个变量的值互换

解题思路&#xff1a; 以引用作为形参&#xff0c;在虚实结合时建立变量的引用&#xff0c;使形参名作为实参的"引用"&#xff0c;即形参成为实参的引用。 编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 在定义swap函数声明形参时&#…

有一个主域名跟多个二级子域名时该怎么申请SSL证书?

当您拥有主域名以及多个子域名时&#xff0c;选择合适的SSL证书类型对于确保网站的安全性至关重要。以下是三种SSL证书类型的简要介绍&#xff1a; 单域名SSL证书&#xff1a; 功能&#xff1a;只能绑定单个域名&#xff0c;无论是主域名还是子域名。 适用场景&#xff1a;仅…

(3)图像识别yolov5—训练自定义模型

目录 1. 准备数据集 (1) 收集图像: (2) LabelImg标注图像: 2. 模型训练 3. 评估模型 4. 使用模型进行推理 5. 完整文件下载 YOLOv5 是一个用于目标检测的深度学习模型,它非常流行且易于使用。如果你想使用 YOLOv5 训练自定义的模型,以下是一个基本的步骤指南…

狒狒吃香蕉(二分查找)

狒狒吃香蕉&#xff08;二分查找&#xff09; 这个问题可以形式化为一个搜索问题&#xff0c;在可能的速度范围[1, max]内寻找一个合适的速度K&#xff0c;其中max是香蕉堆中最大一堆的香蕉数量。 我们知道&#xff0c;如果狒狒的速度太慢&#xff0c;她将无法在警卫回来之前吃…

[项目推荐]EmoLLM-心理健康大模型

EmoLLM 是一系列能够支持理解用户-支持用户-帮助用户心理健康辅导链路的开源心理健康大模型&#xff0c;由LLM指令微调而来。它旨在全面理解和促进个体、群体乃至整个社会的心理健康状态。 项目介绍 GitHub&#xff1a;https://github.com/SmartFlowAI/EmoLLM 【EmoLLM项目提供…

Linux---sudo命令

文章目录 目录 文章目录 一.sudo命令简介 二.sudo 命令的特点 三.sudo 相关文件 四.sudo 命令授权配置 一.sudo命令简介 sudo 命令全称“SuperUser Do”&#xff0c;是Linux系统中的一个命令能够使普通用户以超级用户身份去执行某些命令。 二.sudo 命令的特点 sudo能够授权…

论文阅读:All-In-One Image Restoration for Unknown Corruption

发表时间&#xff1a;2022 cvpr 论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Li_All-in-One_Image_Restoration_for_Unknown_Corruption_CVPR_2022_paper.pdf 项目地址&#xff1a;https://github.com/XLearning-SCU/2022-CVPR-AirNet 代码解读…

诊所管理系统免费软件哪个好一点?

不少诊所管理者&#xff0c;想要寻找一款适合自己诊所的免费诊所管理系统。市场上有多个选择&#xff0c;那么&#xff0c;哪个会好一点呢?在选择适合自己诊所的免费诊所管理系统时&#xff0c;考虑系统的易用性、功能全面性、技术支持以及未来可扩展性是非常重要的。下面&…

在AMD GPU上加速大型语言模型的Flash Attention

Accelerating Large Language Models with Flash Attention on AMD GPUs — ROCm Blogs 引言 在这篇博客文章中&#xff0c;我们将指导您如何在AMD GPU上安装Flash Attention&#xff0c;并提供与在PyTorch中标准SDPA比较其性能的基准测试。我们还将测量Hugging Face中多个大型…