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 多克创新官方店-淘宝网全品大优惠优惠!!!

    目录
    相关文章
    |
    8天前
    Exception in thread “main“ java.lang.NoClassDefFoundError: freemarker/template/Configuration
    Exception in thread “main“ java.lang.NoClassDefFoundError: freemarker/template/Configuration
    29 0
    |
    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 问题处理
    30 1
    |
    8天前
    |
    XML Java Maven
    nested exception is java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be ope
    nested exception is java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be ope
    80 0
    nested exception is java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be ope
    |
    8天前
    |
    Java
    springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
    springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
    18 0
    |
    8天前
    |
    Java
    Java Exception打印及输出到日志
    有时候如果打印出异常的错误,并记录下来,这里记录一下
    54 5
    |
    8天前
    |
    SQL Java 数据库连接
    解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
    解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
    28 0
    |
    8天前
    |
    Java Maven Spring
    SpringBoot运行出现 Lookup method resolution failed; nested exception is java.lang.IllegalStateException
    SpringBoot运行出现 Lookup method resolution failed; nested exception is java.lang.IllegalStateException
    205 0
    |
    8天前
    |
    Java 应用服务中间件
    SprinBoot项目启动报错Exception in thread “main“ java.lang.reflect.InvocationTargetException
    SprinBoot项目启动报错Exception in thread “main“ java.lang.reflect.InvocationTargetException
    171 0
    |
    8天前
    |
    Java Spring
    上传文件出现 aximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.
    上传文件出现 aximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.
    15 0
    |
    8天前
    |
    SQL Java 数据库连接
    解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
    解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
    30 0