Java Exception 详解

简介: Java Exception 详解

一、什么是Exception

术语异常是短语“异常事件”的缩写

定义:异常是在程序执行期间发生的事件,它中断程序指令的正常流动。

当方法中发生错误时,该方法创建一个对象并将其传递给运行时系统。该对象称为异常对象,包含有关错误的信息,包括其类型和发生错误时程序的状态。创建异常对象并将其传递给运行时系统称为引发异常。

在方法抛出异常后,运行时系统试图找到一些东西来处理它。处理异常的可能“somethings”集合是已调用以到达发生错误的方法的有序方法列表。方法列表称为调用堆栈(请参见下图)。

image.gif编辑

运行时系统在调用堆栈中搜索包含可以处理异常的代码块的方法。此代码块称为异常处理程序。搜索从发生错误的方法开始,并以调用方法的相反顺序遍历调用堆栈。当找到适当的处理程序时,运行时系统将异常传递给处理程序。如果引发的异常对象的类型与处理程序可以处理的类型匹配,则认为异常处理程序是适当的。

所选的异常处理程序被称为捕获异常。如果运行时系统穷尽搜索调用堆栈上的所有方法,而没有找到适当的异常处理程序,如下图所示,则运行时系统(以及程序)将终止。

image.gif编辑 与传统的错误管理技术相比,使用异常来管理错误具有一些优势。您可以在“异常的优势”部分中了解更多信息。

二、捕获或指定要求

有效的Java编程语言代码必须满足Catch或Specify要求。这意味着可能引发某些异常的代码必须由以下任一项括起来:

    • 捕获异常的try语句。try必须为异常提供处理程序,如捕获和处理异常中所述。
    • 指定它可以引发异常的方法。该方法必须提供列出异常的throws子句,如指定由方法引发的异常中所述。

    无法满足Catch或Specify要求的代码将无法编译。

    并非所有例外都受Catch或Specify要求的约束。为了理解原因,我们需要研究三种基本的例外类别,其中只有一种符合要求。

    三、三种Exceptions

    第一种异常是检查异常。这些是编写良好的应用程序应该预见并从中恢复的异常情况。例如,假设应用程序提示用户输入输入文件名,然后通过将名称传递给java.io.FileReader的构造函数来打开该文件。通常,用户提供现有可读文件的名称,因此FileReader对象的构造成功,应用程序的执行正常进行。但有时用户提供不存在的文件的名称,构造函数抛出java.io.FileNotFoundException。编写良好的程序将捕获此异常并通知用户错误,可能会提示输入更正的文件名。

    选中的异常受Catch或Specify要求的约束。除错误、运行时异常及其子类所指示的异常外,所有异常都是检查异常。

    第二种异常是错误。这些是应用程序外部的异常情况,应用程序通常无法预测或恢复。例如,假设应用程序成功地打开文件以进行输入,但由于硬件或系统故障而无法读取该文件。不成功的读取将引发java.io.IOError。应用程序可能会选择捕获此异常,以通知用户问题-但程序打印堆栈跟踪并退出也可能有意义。

    错误不受Catch或Specify要求的约束。错误是由Error及其子类指示的异常。

    第三种异常是运行时异常。这些是应用程序内部的异常情况,应用程序通常无法预测或恢复。这些通常表示编程错误,例如逻辑错误或API使用不当。例如,考虑前面描述的应用程序,该应用程序将文件名传递给FileReader的构造函数。如果逻辑错误导致向构造函数传递null,构造函数将抛出NullPointerException。应用程序可以捕获此异常,但消除导致异常发生的错误可能更有意义。

    运行时异常不受Catch或Specify要求的约束。运行时异常是由RuntimeException及其子类指示的异常。

    错误和运行时异常统称为未检查异常。




    Doker 技术人的数码品牌!!!

    文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群!!!你的支持和鼓励是我创作的动力❗❗❗

    官网:Doker 多克; 官方旗舰店首页-Doker 多克创新官方店-淘宝网全品大优惠优惠!!!

    目录
    相关文章
    |
    6月前
    Exception in thread “main“ java.lang.NoClassDefFoundError: freemarker/template/Configuration
    Exception in thread “main“ java.lang.NoClassDefFoundError: freemarker/template/Configuration
    175 0
    |
    20天前
    |
    Java 网络安全 Maven
    Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
    【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
    37 2
    |
    1月前
    |
    Java
    让星星⭐月亮告诉你,Java异常分类[Throwable(Error/Exception(RuntimeException/其他异常)) 检查时异常 非检查时异常]
    本文深入解析了Java异常处理机制,重点介绍了`Throwable`类及其子类`Error`和`Exception`,并通过实例代码、流程图和表格详细解释了异常的分类、区别及处理方法,帮助读者掌握异常处理的关键技巧,提升程序的稳定性和健壮性。
    47 1
    |
    6月前
    |
    搜索推荐 Java 开发者
    org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 问题处理
    【5月更文挑战第14天】org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 问题处理
    584 1
    |
    3月前
    |
    Java 测试技术 Maven
    成功解决:nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
    这篇文章介绍了解决Spring框架中出现的`java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource`错误的步骤,指出错误原因是缺少`spring-aop`模块的jar包,并提供了通过Maven依赖或手动添加jar包到项目中的方法来解决这个问题。
    成功解决:nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
    |
    4月前
    |
    消息中间件 Java Kafka
    zookeeper:Unexpected exception, exiting abnormally ::java.io.EOFException
    zookeeper:Unexpected exception, exiting abnormally ::java.io.EOFException
    130 1
    zookeeper:Unexpected exception, exiting abnormally ::java.io.EOFException
    |
    3月前
    |
    Java
    Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx()V
    Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx()V
    20 0
    |
    5月前
    Exception in thread "main" java.lang.IllegalArgumentException: U+6570 ('.notdef') is not available in the font Helvetica-Bold, encoding: WinAnsiEncoding 这个问题如何解决
    【6月更文挑战第19天】Exception in thread "main" java.lang.IllegalArgumentException: U+6570 ('.notdef') is not available in the font Helvetica-Bold, encoding: WinAnsiEncoding 这个问题如何解决
    771 2
    |
    5月前
    |
    关系型数据库 分布式数据库 数据库
    PolarDB操作报错合集之遇到报错:Exception in thread "main" java.lang.NoClassDefFoundError: jpcap/JpcapCaptor,该怎么解决
    PolarDB是阿里云推出的一种云原生数据库服务,专为云设计,提供兼容MySQL、PostgreSQL的高性能、低成本、弹性可扩展的数据库解决方案,可以有效地管理和优化PolarDB实例,确保数据库服务的稳定、高效运行。以下是使用PolarDB产品的一些建议和最佳实践合集。
    |
    6月前
    Exception in thread "main" java.lang.IllegalArgumentException: U+6570 ('.notdef') is not available in the font Helvetica-Bold, encoding: WinAnsiEncoding 问题解决
    【5月更文挑战第26天】Exception in thread "main" java.lang.IllegalArgumentException: U+6570 ('.notdef') is not available in the font Helvetica-Bold, encoding: WinAnsiEncoding 问题解决
    462 2