Java异常分类及处理

news/2025/1/31 14:41:50/文章来源:https://www.cnblogs.com/Marktowin/p/18694822

Throwable 是 Java 语言中所有错误或异常的超类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
实例分为 Error 和 Exception 两种。

 其中,AWTError GUI图形界面化编程相关异常。

 

Error(错误)

  是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

  这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

 

Exception(异常)

是程序正常运行中,可以预料的意外情况,但属于程序可以处理的异常情况。比如数据库连接中断,空指针,数组下标越界。异常出现可以导致程序非正常终止,也可以预先检测,被捕获处理掉,使程序继续运行。EXCEPTION(异常)按照性质,又分为编译异常(可检测)和运行时异常(不可检测)。

  • 编译时异常:又叫可检查异常,通常时由语法错和环境因素(外部资源)造成的异常。比如输入输出异常IOException,数据库操作SQLException。其特点是,Java语言强制要求捕获和处理所有非运行时异常。通过行为规范,强化程序的健壮性和安全性。如果不处理,程序就不能编译通过。

  • 运行时异常:又叫不检查异常RuntimeException,这些异常一般是由程序逻辑错误引起的,即语义错。比如算术异常,空指针异常NullPointerException,下标越界IndexOutOfBoundsException。运行时异常应该在程序测试期间被暴露出来,由程序员去调试,而避免捕获。Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

运行时异常和编译时异常之间的区别:是否强制要求调用者必须处理此异常。如果强制要求调用者必须进行处理,那么就使用编译时异常(IDE一般会提示);否则就选择运行时异常(RuntimeException)。一般来讲,如果没有特殊的要求,建议使用RuntimeException异常。

Error和Exception区别

  • Error通常是灾难性的错误,因为发生该错误的时候,程序是无法控制的,JVM会选择终止线程;
  • Exception通常是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
  • 异常能被程序本身可以处理,错误是无法处理。

Java异常处理机制

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常

  • 抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
  • 捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

对于运行时异常、错误或可查异常,Java要求的异常处理方式有所不同:

  • 对运行时异常:由于运行时异常的不可查性,为了更合理更容易地运行程序,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。
  • 对于错误:对于方法运行中可能出现的Error,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。
  • 对编译异常:对于所有的可查异常,Java规定:一个方法必须捕捉,或者声明抛出方法之外。也就是说,当一个方法选择不捕捉可查异常时,它必须声明将抛出异常。

能够捕捉异常的方法,需要提供相符类型的异常处理器。所捕捉的异常,可能是由于自身语句所引发并抛出的异常,也可能是由某个调用的方法或者Java运行时 系统等抛出的异常。也就是说,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。

从方法中抛出的任何异常都必须使用throws子句。捕捉异常通过try-catch语句或者try-catch-finally语句实现。

结论:

  Java规定:对于编译异常(可查异常)必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error。

Java异常捕获

  1. try-catch语句,异常通过try-catch语句捕获。
  2. try-catch-finally语句,try-catch语句还可以包括第三部分,就是finally子句。它表示无论是否出现异常,都应当执行的内容。

    当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:

    1)在finally语句块中发生了异常。

    2)在前面的代码中用了System.exit()退出程序。

    3)程序所在的线程死亡。

    4)关闭CPU。

Java异常抛出

  任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。从方法中抛出的任何异常都必须使用throws子句。throw 用在函数内,后面跟的是异常对象。使用throws关键字将异常抛给调用者后,如果调用者不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的调用者。

抛出异常有三种形式,一是 throw,二是 throws,还有一种系统自动抛异常。

Throw 和 throws 的区别

throws 用在函数上,后面跟的是异常类,可以跟多个异常类型,throw 用在函数内,后面跟的是异常对象;throws Ex1,Ex2,Ex3只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常Ex1,Ex2,Ex3可能是该函数体产生的;throw则是明确了这个地方要抛出某个异常;throws 用来声明异常,让调用者知道该功能可能会出现的问题(比如上方的 IO 异常),可以给出预先的处理方式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。即 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。

总结:

  • throws 表示出现异常的一种可能性,并不一定会发生这些异常;
  • throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。

 

 

 

 

参考:

Java异常分类及处理 - niceyoo - 博客园

深入理解 java 异常处理机制-腾讯云开发者社区-腾讯云

 

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

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

相关文章

Apple Safari 18.3 - macOS 专属浏览器 (独立安装包下载)

Apple Safari 18.3 - macOS 专属浏览器 (独立安装包下载)Apple Safari 18.3 - macOS 专属浏览器 (独立安装包下载) 适用于 macOS Sonoma 和 macOS Ventura 的 Safari 浏览器 18 请访问原文链接:https://sysin.org/blog/apple-safari-18/ 查看最新版。原创作品,转载请保留出处…

AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试

AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试 Rapid7 Dynamic Application Security Testing (DAST) released Jan 30, 2025 请访问原文链接:https://sysin.org/blog/appspider/ 查看最新版。原创作品…

Nexpose 7.4.0 for Linux Windows - 漏洞扫描

Nexpose 7.4.0 for Linux & Windows - 漏洞扫描Nexpose 7.4.0 for Linux & Windows - 漏洞扫描 Rapid7 on-prem Vulnerability Management, released Jan 30, 2025 请访问原文链接:https://sysin.org/blog/nexpose-7/ 查看最新版。原创作品,转载请保留出处。 作者主页…

kuboard作为k8s的dashboard使用

kuboard作为k8s的dashboard使用 1 资源信息主机名 OS IP CPU/MEMERY/DISK 备注k8s-master Rocky-8.10 172.16.1.30 2core/4GiB/100GiB k8s-v1.28.0k8s-node01 Rocky-8.10 172.16.1.31 4core/8GiB/100GiB k8s-v1.28.0k8s-node02 Rocky-8.10 172.16.1.32 4core/8GiB/100GiB k8s-v…

Python GIL(全局解释器锁)机制对多线程性能影响的深度分析

在Python开发领域,GIL(Global Interpreter Lock)一直是一个广受关注的技术话题。在3.13已经默认将GIL去除,在详细介绍3.13的更亲前,我们先要留了解GIL的技术本质、其对Python程序性能的影响。本文将主要基于CPython(用C语言实现的Python解释器,也是目前应用最广泛的Pyth…

java中的ArrayBlockingQueue

ArrayBlockingQueue ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个线程安全的阻塞队列实现。 它基于数组实现,容量固定,支持先进先出的顺序。 Array Blocking Queue 数组阻塞队列 读音: [əˈreɪ] [ˈblɒkɪŋ] [kjuː] concurrent 同时发生的 /…

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) @目录五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置4…

一文搞懂编程在开源软件运动中的应用

一文搞懂编程在开源软件运动中的应用一文搞懂编程在开源软件运动中的应用一理解开源软件运动文本内容开源软…………```HTML一文搞懂编程在开源软件运动中的应用一、理解开源软件运动:<!DOCTYPE html><html><head><meta charset="UTF-8"> &…

makefile在编译后输出STM32的Flash RAM占用情况的方法

本文介绍了在用makefile组织的STM32工程中,怎么在编译完成后计算并显示Flash和RAM占用情况的方法。知乎 - STM32 GCC工程编译后输出FLASH RAM使用占比的方法 里面这个方法看得我血压飙升,本身代码很不直观,写起来要反斜杠,还留了两行没用的代码,还有各种依赖命令,subst和…