首页 > 编程语言 >Java 中 Exception 和 Error 有什么区别?

Java 中 Exception 和 Error 有什么区别?

时间:2024-08-08 12:54:55浏览次数:15  
标签:Exception Java 捕获 try Error catch 异常 代码

1. Exception

  • Exception 代表程序正常运行过程中可以预料到的意外情况,应该被开发者捕获并进行相应处理。

2. Error

  • Error 指在正常情况下不太可能出现的情况。
  • 大部分 Error 导致程序处于不正常、不可恢复的状态,所以不便也不需被开发者捕获,因为这个情况下你捕获了也无济于事。

3. Throwable

  • Exception 和 Error 都是继承自 Throwable 类。
  • 在Java代码中,只有继承自 Throwable 的实例可以被 throwcatch

4. 注意事项

4.1 捕获特定的异常
  • 避免捕获通用的 Exception异常,而应该捕获特定的异常。

软件工程是一门协作的艺术,在日常的开发中我们有义务使自己的代码能更直观、清晰的表达出我们想要表达的信息。
但是如果你什么异常都用了Exception,那别的开发同事就不能一眼得知这段代码实际想要捕获的异常,并且这样的代码也会捕获到可能你希望它抛出而不希望捕获的异常。

4.2 不要“吞”了异常
  • 捕获异常后,应将异常信息输出到日志,不要仅仅使用 e.printStackTrace()

如果我们捕获了异常,不把异常抛出,或者没有写到日志里,那会出现什么情况?线上除了bug莫名其妙的没有任何的信息,你都不知道哪里出错以及出错的原因。
这可能会让一个简单的bug变得难以诊断,而且有些同学比较喜欢用catch之后用e.printStackTrace(),在我们产品中通常不推荐用这种方法,一般情况下这样是没有问题的但是这个方法输出的是个标准错误流。
比如是在分布式系统中,发生异常但是找不到stacktrace。
所以最好是输入到日志里,我们产品可以自定义一定的格式,将详细的信息输入到日志系统中,适合清晰高效的排查错误。

4.3 不要延迟处理异常
  • 应在方法开始时尽早检查并处理可能的异常,避免深层调用后再处理。

比如你有个方法,参数是个name,函数内部调了别的好几个方法,其实你的name传的是null值,但是你没有在进入这个方法或者这个方法一开始就处理这个情况,而是在你调了别的好几个方法然后爆出这个空指针。
这样的话明明你的出错堆栈信息只需要抛出一点点信息就能定位到这个错误所在的地方,经过了好多方法之后可能就是一坨堆栈信息。

4.4 只在必要的范围内使用 try-catch
  • 尽量缩小 try-catch 的范围,避免影响JVM对代码的优化。

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

4.5 不要通过异常来控制程序流程
  • 使用条件语句(如 if/else)而不是异常来控制程序流程。

一些可以用if/else的条件语句来判断例如null值等,就不要用异常,异常肯定是比一些条件语句低效的,有CPU分支预测的优化等。而且每实例化一个Exception都会对栈进行快照,相对而言这是一个比较重的操作,如果数量过多开销就不能被忽略了。

4.6 不要在 finally 代码块中处理返回值
  • 避免在 finally 块中使用 return 或处理返回值,以免覆盖 try 块中的返回或屏蔽异常。

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

标签:Exception,Java,捕获,try,Error,catch,异常,代码
From: https://blog.csdn.net/Alfred_tfk/article/details/141024019

相关文章

  • 什么是 Java 中的不可变类?
    不可变类是指创建后无法修改对象状态的类。String类是Java中典型的不可变类。1.不可变类的特点一旦创建,对象的状态就不能被改变。所有成员变量都是final类型。所有可变成员变量都是私有的,并且没有提供修改它们的公共方法。2.不可变类的示例以String类为例,执行s......
  • Flink开发:Java vs. Scala - 代码对比分析,选择你的最佳拍档
    一、引言1.1Flink简介ApacheFlink是一个开源的流处理框架,它支持高吞吐量、低延迟以及复杂的事件处理。Flink的核心是一个流式数据流执行引擎,它的针对数据流的分布式计算提供了数据分发、通信、容错机制。Flink提供了多种API,包括DataStreamAPI(用于构建流处理程序)、D......
  • 基于JAVA的宠物店会员管理系统设计与实现,源码、部署+讲解
    摘要随着计算机和网络的不断革新,世界也已进入了前所未有的电子时代。作为实用性强、应用范围广泛的会员管理系统也在被越来越多的行业所使用。当今社会经济发展迅速,宠物在人们生活中的地位也越来越高。市场上迫切需求一款便携操作的宠物会员管理。因此需要设计开发在效率、功......
  • Java 基础
    Java基础目录Java基础1第一个Java程序2IDEA中的代码结构3Variables与Types3.1数据类型3.2变量的注意事项3.3关键字3.4标识符4运算符4.1算术运算符4.1.1不同数字类型相加4.1.2字符相加4.1.3字符串相加4.3赋值运算符4.4关系运算符4.5逻辑运算符5逻辑控制语句5......
  • Java poi3.17 如何区分获取日期类型的单元格的值
     1、网上看了好多方案,似乎都没有效果。2、解决方法:如果是日期类型的单元格,index是等于3的。但是我偶尔到的情况,不是等于日期类型,也会等于3,这时获取Datedate=cell.getDateCellValue();值会报错,解决方法,就是用try/catch包起来,继续使用dataForMatter.formatCellValue(cel......
  • Java基础(面向对象)
    标签(空格分隔):Java面向对象的特征一:封装与隐藏一、问题引入当我们创建一个类的对象以后,我们可以通过“对象.属性”的方法,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和储存范围的制约。除此之外,没有其他约束条件。但是,实际问题中,我们往往需要给属性赋值加入额外......
  • [Java SE] 核心源码精讲:java.util.Optional(JDK1.8-)
    1概述:java.util.Optional该类是Java8中引入的一个用于处理可能为null的值的容器类。这是一个容器对象,可能包含或不包含非空值。自Java1.8起支持如果有值存在,isPresent()方法将返回true;而get()方法将返回该值,若无值存在,将报异常java.util.NoSuchElement......
  • Java中一维数组的学习
    一维数组目录一维数组创建数组null数组的遍历for循环遍历数组for-each循环遍历while循环遍历do-while循环遍历数组的反向遍历创建数组Java语言使用new操作符来创建数组,语法如下:arrayRefVar=newdataType[arraySize];上面的语法语句做了两件事:使用dataType[arraySize]......
  • java集成onlyoffice实现文档在线预览编辑
    一、onlyoffice是什么ONLYOFFICE是一款由AscensioSystemSIA公司开发的在线办公软件套件,它提供了文档编辑、电子表格、演示文稿和表单等多种办公工具,旨在提高团队协作效率和文档处理的便捷性。以下是关于ONLYOFFICE的详细介绍:1、软件概述名称:ONLYOFFICE文档(英文名ONLYOFFIC......
  • 如何把Connection 封装到工具类里面 调用工具类方法实现 增删改查操作 java JDBC
    如何把Connection封装到工具类里面调用工具类方法实现增删改查操作javaJDBC使用数据库连接池以HikariCP为例在JDBC中,使用数据库连接池是一个常见的做法,以提高数据库操作的效率和性能。连接池管理着一组数据库连接,这些连接可以被重用而不是每次需要时都创建新的连接。......