Java中的 Exception 和 Error 有什么区别

news/2024/11/14 18:41:42/文章来源:https://www.cnblogs.com/qimoxuan/p/18540717

Exception 和 Error 都是 Throwable 类的子类(在Java代码中只有继承了 Throwable 类的实例才可以被 throw 或者被 catch)它们表示在程序运行时发生的异常或错误情况。

总结来看: Exception 表示可以被处理的程序异常,Error 表示系统级的不可恢复错误。

详细说明:

1)Exception :是程序中可处理的异常情况,表示程序逻辑或外部环境中的问题,可以通过代码进行恢复或处理。

  常见的子类有:IOException 、SQLException 、NullPointerException 、IndexOutOfBoundsException 等。

  Exception 又分为 Checked Exception (编译期异常)和 Unchecked Exception (运行时异常)。

  • Checked Exception:在编译时必须显式处理(如使用 try-catch 块或者通过 rthrows 声明抛出)。如 IOException 。
  • Unchecked Exception:运行时异常,不需要显式捕获。常见的如 NullPointerException 、IllegalArgumentException 等,继承自 RuntimeException 。

2)Error:表示严重的错误,通常是 JVM 层次内系统级的、无法预料的错误,程序无法通过代码进行处理或恢复。例如内存耗尽( OutOfMemoryError )、栈溢出( StackOverflowError )。

Error 不应该被程序捕获或处理,因为一般出现这种错误时程序无法继续运行。

扩展知识

异常处理时需要注意的六个点

1.尽量不要捕获类似 Exception 这样通用的异常,而应该捕获特定的异常。

软件工程是一门协作的艺术,在日常开发中我们有义务使自己的代码能更直观、清晰地表达出我们想要表达的信息。

但是如果你什么异常都用了 Exception ,那别的开发同事就不能一眼得知这段代码实际想要捕获的异常,并且这样的代码也会捕获到可能你希望它抛出而不希望捕获的异常。

2.不要“吞”了异常

如果我们捕获了异常,不把异常抛出,或者没有写到日志里,那会出现什么情况?线上除了 bug 莫名其妙的没有任何的信息,你都不知道哪里出错以及出错的原因。

这可能会让一个简单的 bug 变得难以诊断,而且有些同学比较喜欢用 catch 之后用 e.printSrackTrace(),在我们产品中通常不推荐用这种方法,一般情况下这样是没有问题的但是这个方法输出的是个标准错误流。

比如在分布式系统中,发生异常但是找不到 stacktrace 。

所以最好是输出到日志里,我们可以自定义一定的格式,将详细的信息输入到日志系统中,适合清晰高效的排查错误。

3.不要延迟处理异常

比如你有个方法,参数是个 name ,函数内部调用了别的好几个方法,其实你的 name 传的是 null 值,但是你没有在进入这个方法或者这个方法一开始就处理这个情况,而是在你调用了别的好几个方法然后爆出这个空指针。

这样的话明明你的出错堆栈信息只需要抛出一点点信息就能定位到这个错误所在的地方,经过了许多方法之后可能就是一坨堆栈信息。

4.只在需要 try-catch 的地方 try-catch ,try-catch 的范围能小则小

只在必要的代码段使用 try-catch ,不要不分青红皂白 try 住一坨代码,因为 try-catch 中的代码会影响 JVM 对代码的优化,例如重排序。

5.不要通过异常来控制程序流程

一些可以用 if/else 的条件语句来判断例如 null 值等,就不要用异常,异常肯定是比一些条件语句低效的,有 CPU 分支预测的优化等。

而且每实例化一个 Exception 都会对栈进行快照,相对而言这是一个比较重的操作,如果数量过多开销就不能被忽略了。

6.不要在 finally 代码块中处理返回值或者直接 return

在 finally 中 return 或者处理返回值会发生很诡异的事情,比如覆盖了 try 中的 return ,或者屏蔽的异常。

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

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

相关文章

数据采集与融合技术实验课程作业三

数据采集与融合技术实验课程作业三作业所属课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology作业链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13287gitee码云代码位置 https://gitee.com/wang-qi…

HTTPS ppt素材

本来的主题是介绍一下我之前做的搜索与推荐的业务,但9月份开始我主要开始承担一些医那块的业务测试,就想做点别的分享,但换成医的业务介绍,想了想我目前对医的了解程度,实在没勇气拿出来分享,所以就换了这个主题。 这个主题其实也是早有预谋,一个初衷是想对某一个通用性…

jvm 堆内存

堆、方法区、直接内存,多个线程之间是共享的。 ------------ 堆内存是会溢出的。 堆内存默认最大是7G

CdnCheck工具

前言:CdnCheck工具实现,记录下我这边实现的几个点 参考文章:https://github.com/projectdiscovery/cdncheck 参考文章:https://github.com/YouChenJun/CheckCdn 参考文章:https://github.com/zu1k/nali 参考文章:https://github.com/u9sky/cdn-cname-domain/blob/main/cd…

考研打卡(14)

开局(14) 开始时间 2024-11-11 20:21:43 结束时间 2024-11-11 22:00:55今天考研数学的资料到了数据结构设一组初始记录关键字序列为(50,40,95,20,15,70,60,45), 则以增量d=4的一趟希尔排序结束后前4条记录关键字为_____(中国地质大学2017年) A 40,50,20,95 B 15,40,6…

说明与笔记导航(咕咕咕)

对使用这些笔记的同学想说的话,以及更新进度。为什么写这么多B东西? 其一呢是帮助我自己,边写笔记边梳理知识;其二呢是帮助各位义父义母考试成功。 更新进度与内容说明 11.11:本周工作日需突击学习python,有限体积N-S方程推导已写完。 目前进度:3009 建模:数值方法写完…

运用Windows API进行编程

目录运用Windows API进行编程实验环境窗口创建基本流程基本代码流程1、头文件和库2、全局变量和函数3、入口主函数4、注册窗口类函数5、创建和显示窗口函数6、窗口过程函数运行结果实验小结 运用Windows API进行编程 运行Windows应用程序在桌面显示Windows窗口。窗口内背景色为…

Windows API窗口绘图程序设计

目录Windows API窗口绘图程序设计1、窗口过程函数2、WM_LBUTTONDOWN:处理鼠标左键按下的消息鼠标消息相关知识点基本鼠标消息双击消息附带信息滚轮消息附带信息:3、WM_PAINT:处理窗口重绘的消息窗口绘图相关知识点窗口绘图基本流程开始绘画绘制封闭图形(能使用画刷填充的图形…

Matlab常用的图像属性

线型、标记和颜色 线型、标记和颜色,指定为包含符号的字符串或字符向量。符号可以按任意顺序显示。不需要同时指定所有三个特征(线型、标记和颜色)。例如,如果忽略线型,只指定标记,则绘图只显示标记,不显示线条。以下是 MATLAB 在许多类型的绘图中使用的默认颜色的 RGB …

jvm Java虚拟机栈——栈内存溢出

----------- ---------------------- -----------------

学习笔记(三十五):ArkTs-@ohos.util.ArrayList (线性容器ArrayList)

概述: 一种线性数据结构,底层基于数组实现一、导入import { ArrayList } from @kit.ArkTS; 二、定义let arrayList: ArrayList<string | number> = new ArrayList(); 三、常用函数 1、 add,在ArrayList尾部插入元素 2、insert,在长度范围内任意位置插入指定元素3、…

Scrum冲刺-第一篇

这个作业属于哪个课程 广工计院计科34班这个作业要求在哪里 作业要求这个作业的目标 小队各成员的任务确认和项目期望一、团队简介: 队名:edg.gdut 成员:姓名 学号罗祖文 3121004537郑志涛 3122004547陈恺麟 3122004515许凌铎 3122004540邓茗骏 3122004517李晓彬 3122004531…