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

Java中的 Exception 和 Error 有什么区别

时间:2024-11-11 22:32:05浏览次数:3  
标签:Exception Java 代码 try Error catch 异常

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 ,或者屏蔽的异常。

标签:Exception,Java,代码,try,Error,catch,异常
From: https://www.cnblogs.com/qimoxuan/p/18540717

相关文章

  • Java面试之多线程&并发篇
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!如何停止一个正在运行的线程?notify()和notifyAll()有什么区别?sleep()和wait()有什么区别?volatile是什么?可以保证有序性吗?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***如......
  • 深入理解Java线程池:线程任务完成检测的原理与实现
    在Java中,线程池(ThreadPool)是用于管理和复用线程的机制,通过它可以高效地管理多线程任务。一个常见的问题是:线程池是如何知道某个线程的任务已经完成的?本篇文章将深入探讨线程池任务完成的检测原理,并结合代码示例,让大家深入理解线程池的工作方式。推荐正在找工作的朋友们:就......
  • Java Lambda表达式与函数式接口和Stream API的常用方法
    JavaLambda表达式常与函数式接口和流(StreamAPI)一起使用,提供了非常强大的方式来处理集合和其他数据结构。以下是一些常用的Lambda表达式方法和它们的用途,特别是在结合java.util.stream.Stream时:1.map()用途:用于将流中的每个元素转换成另一种形式。示例:List<String>name......
  • Java中包装类型和基本类型的区别:深入理解与应用
    Java中包装类型和基本类型的区别:深入理解与应用引言在Java编程中,基本类型(PrimitiveTypes)和包装类型(WrapperTypes)是两种不同的数据类型。基本类型是Java语言的核心部分,而包装类型则是为了提供更多的功能和灵活性。本文将深入探讨Java中包装类型和基本类型的区别,帮助你更......
  • 深入理解Java动态代理:原理、实现与应用
    深入理解Java动态代理:原理、实现与应用在现代软件开发中,面向对象编程(OOP)和面向切面编程(AOP)是两种重要的编程范式。Java语言中的动态代理(DynamicProxy)是实现AOP的关键技术之一,它允许我们在运行时创建一个代理对象,该代理对象可以拦截对真实对象方法的调用,并在方法调用前......
  • Java 8 Optional:用法和问题与解决示范
    1.引言Java8引入了Optional类来解决传统空指针异常(NullPointerException)的问题。Optional是一个容器类,专门用于表示可能包含或不包含非空值的对象。本文将深入探讨Optional的常见用法、常见问题及其解决方案,以及在实际项目中如何利用Optional优化代码结构,提高代......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现三
    一、前言介绍:[免费获取]1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵活、便......
  • Java实现常用加密算法-SM4
    参考博客:https://blog.csdn.net/m0_46713218/article/details/143099878参考博客:sm4前后端加密集成pom:<!--SM4加密依赖包--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现四
    一、前言介绍:免费获取:猿来入此1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵......
  • Java毕设项目案例实战II基于Java+Spring Boot+MySQL的狱内罪犯危险性评估系统设计与实
    目录一、前言二、技术介绍三、系统实现四、核心代码五、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。一、前言在司法体系中,狱内罪犯的危险性评估是确保监狱安全、提升管理效率的关键环节。传统......