思维导图:
第5章 异常
学习目标
- 概念理解:了解什么是异常,及其在Java中的定义。
- 异常分类:区分运行时异常与编译时异常,并理解其特点。
- 异常处理:熟悉异常产生及其处理过程,掌握处理异常的5个关键字。
- 代码实现:
- 理解并应用
try…catch
语句和finally
语句处理异常。 - 掌握
throws
关键字抛出异常。 - 掌握
throw
关键字主动抛出异常。 - 学会自定义异常,编写自定义异常类。
- 理解并应用
异常简介
- 定义:Java中的异常是程序运行时出现的错误或非正常情况。
- 特征:异常通常由程序输入、对象状态或运行环境导致。
- 处理:异常的处理改变程序的控制流,防止影响其他程序运行。
5.1 什么是异常
- 案例:尝试以0作为除数。
- 结果:程序抛出
ArithmeticException
,并中止执行。
异常类别
- Throwable类:所有异常和错误的超类。
- Error类:表示系统错误和资源耗尽错误,通常外部环境导致,不由程序逻辑控制。
- Exception类:表示可处理错误,分为运行时异常(
RuntimeException
)和非运行时异常。
Throwable类的方法
String getMessage()
:获取异常消息字符串。String toString()
:获取异常的简单信息描述。void printStackTrace()
:打印异常的跟踪栈信息。
小结
异常处理是程序健壮性的关键。Java通过异常类和异常处理机制,为开发者提供了一种强大的工具来管理程序运行时的错误和异常情况。学会正确处理异常,可以避免程序因未预见的问题而完全失败,提高用户体验和程序的稳定性。
我的理解:
在Java中,异常的概念可以理解为程序执行中的一种非正常情况,它打断了正常的控制流程。这些异常情况通常是由于程序运行时发生的一些错误,这些错误可能是因为程序本身的问题,也可能是由于外部环境造成的。异常机制提供了一种安全的处理错误的方法,确保程序的稳定性和安全性。
为了更加深入地理解异常,我们可以从几个方面来考虑:
1. 异常的种类:
-
编译时异常(Checked Exceptions):这些异常在编译阶段就必须被捕获或者声明抛出,否则程序无法编译通过。例如,尝试打开一个不存在的文件时会抛出
FileNotFoundException
。 -
运行时异常(Runtime Exceptions):这些异常在编译时不会显示错误,只有在运行时才会被抛出。例如,数组越界会抛出
ArrayIndexOutOfBoundsException
,这类异常通常是由于程序逻辑错误导致。 -
错误(Errors):这些是由Java虚拟机生成并抛出的严重问题,如
OutOfMemoryError
。这类错误通常与环境有关,如系统资源耗尽等。
2. 异常的特性:
-
对象:在Java中,异常是对象,它们都是
Throwable
类或其子类的实例。当异常发生时,会创建一个对应的异常对象。 -
传播:当一个方法抛出异常而没有处理时(即没有捕获它),它会被传递(propagate)给它的调用者,这个过程会一直继续,直到找到相应的异常处理代码或者到达了程序的最外层,导致程序终止。
-
捕获与处理:可以使用
try-catch
块来捕获并处理异常。try
块包含可能抛出异常的代码,而catch
块是捕获异常后处理异常的地方。 -
清理:无论是否抛出异常,
finally
块中的代码总是被执行,通常用于资源的清理工作,比如关闭文件流。
3. 异常的处理关键字:
try
:尝试执行的代码块,可能会抛出异常。catch
:捕获异常的代码块,处理异常。finally
:无论是否捕获到异常,该代码块都会执行,用于执行清理操作。throw
:手动抛出一个异常实例。throws
:在方法签名中声明该方法可能会抛出的异常,告知方法的调用者需要对这些异常进行处理。
理解这一节的关键在于明白异常处理不仅仅是一种错误处理机制,而是Java程序设计中保障程序健壮性、增强用户体验和程序可维护性的一个重要部分。
总结:
重点:
- 异常的基本概念:理解异常是什么,以及它们如何影响程序的正常流程。
- 异常的分类:
- 编译时异常:必须在编写代码时显式处理(捕获或声明抛出)的异常。
- 运行时异常:不需要显式处理,通常是程序逻辑错误导致,如
NullPointerException
、ArrayIndexOutOfBoundsException
等。
- 异常处理机制:掌握
try
,catch
,finally
,throw
, 和throws
关键字的用法。 - 自定义异常:如何创建自定义的异常类,并理解其用途。
难点:
- 异常类的层次结构:理解
Throwable
、Error
、Exception
以及它们子类的关系和区别。 - 异常的传播机制:理解一个异常如何从发生地传播到捕获地点的过程。
- 异常处理的最佳实践:学习如何恰当地使用异常处理构造,比如何时使用
try-catch
,何时使用throws
声明,以及何时创建自定义异常。
易错点:
- 混淆异常类型:将运行时异常误认为是编译时异常,或者反过来,导致处理不当。
- 异常捕获顺序:在使用多个
catch
块时,子类异常应该先于父类异常捕获,否则父类的catch
块会拦截到所有的异常,使得子类的catch
块永远不会执行。 - 忽视异常:在
catch
块中空处理或者只是打印异常信息,而没有适当地处理异常,可能会导致程序在错误状态下继续执行,引发更复杂的错误。 - 异常处理代码的滥用:滥用
try-catch
块,可能会隐藏代码中的逻辑错误,使得代码更难以调试和维护。 - 在
finally
块中返回值:这会导致try
或catch
块中的返回值被忽略,这是一个不好的实践,因为它会使程序的控制流变得不清晰。
总的来说,理解异常的类型和处理方法,掌握异常的正确使用方式,以及避免常见的异常处理错误,是这一节的学习关键。