Java异常

本文深入解析Java异常处理机制,包括异常分类(可检查异常、Runtime异常和Error)、异常处理关键字(try、catch、finally、throw、throws)及异常处理过程。此外,还介绍了常用的运行时异常及其区别,以及Java中StackOverflowError和OutOfMemoryError异常的联系与区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Def:异常是指程序运行过程中可能出现的非正常状态。Java异常可以分为两类:可检查异常和非检查异常。

可检查异常:Checked异常。非可检查异常:Runtime异常和Error。

Checked异常:是指可以在编译阶段被处理的异常,所以它强制程序处理所有的Checked异常。

Runtime异常:是运行时异常,表示虚拟机的通常操作中可能存在的异常,是一种的常见的运行错误,无须强制处理。

Error:Error子类之所以属于非检测异常是因为:无法预知它们的产生时间。若Java应用程序内存不足,则随时可能出现OutOfMemoryError;起因一般不是应用程序中的特殊调用,而是JVM自身的问题。另外,Error类一般表示应用程序无法解决的严重问题,故将这些类视为非检测异常。


Java异常处理机制主要依赖于五个关键字:try、catch、finally、throw、throws

try 关键字后紧跟一个花括号括起来的代码块,简称try块。它里面可置引发异常的代码。

catch后对应异常类型和一个代码块,用于表明catch块用于处理这种类型的代码块。后还可以跟一个finally块,finally块用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。

throws关键字主要在方法签名中使用,用于声明该方法可能抛出的异常。

throw则用于抛出一个实际的异常,throw可以单独作为语句使用,抛出一个具体的异常的对象。

PS:为了保证一定能够回收try块中打开的物理资源,异常处理机制提供了finally块,无论try块中的代码是否出现异常,也不管在哪个catch块中被执行,finally块总会被执行。异常处理结构语法中只有try块是必须的,一旦没有try块,则不能出现catchfinally块,如果存在try块,则catch块和finally块都是可选的。但二者至少要出现其一。也可以同时出现多个catch块。catch块必须位于try块后面,而finally必须位于catch块后面(如果存在的话)。

当java程序执行try块,catch块,时遇到了return语句或throw语句,这两个语句都会导致该方法的立即结束,但是系统并不会立即执行这两个语句,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块程序立即执行return语句或throw语句,方法终止。反之,则系统会立即执行finally块——只有当finally块执行完后,系统才会再次跳回来执行try块,catch块里的returnthrow语句,如果同时在 finally块中也存在returnthrow语句,则finally块已经终止了方法,自然不存在系统再次跳转去执行trycatch块里的returnthrow语句。

使用throws声明抛出异常的思路是:当前方法不知道应该如何处理这种异常,该异常应该由上一级调用者处理,如果main方法也不知道如何处理这种异常类型。也可以使用throws声明抛出异常,把该异常交给javaJVM处理。

JVM对异常的处理方法:打印异常跟踪栈信息,并终止程序运行。

不能基于异常来重载方法。在父类中有异常说明,在子类中可以没有。


异常处理过程:如果执行try块里的业务逻辑代码时出现异常,系统自动会生成一个异常对象,该异常对象被提交给java运行环境,这个过程被称为抛出(throw)异常。当java运行环境收到异常对象时,会寻找处理该异常对象的catch块,如果找到合适的catch块并把该异常交给它处理,该过程被称为捕获异常;如果java运行环境找不到捕获异常的catch块,则运行环境终止,程序也将退出。


常用的运行时异常:

 ①illegalArgumentException ②ClassCastException ③IndexOutOfBoundException ④NullPointerException ⑤ArithmeticException

Java中StackOverflowError异常和OutOfMemoryError异常之间联系与区别:

①如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

②如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值