定义
运行时期
发生的不正常情况
处理思想
java通过面向对象的思想用类的形式对异常进行描述,即异常类。
语句try-throw catch 将正常流程代码和问题处理代码分离,提高了程序阅读性。
分类
Throwable:
-
Error
程序运行时
由JVM抛出的严重性问题,无法恢复或不能捕获,一般应用程序无法处理.
常见的两种ERROR:OutOfMemoryError, StackOverflowError- StackOverflowError
线程请求的栈深度大于虚拟机所允许的深度时抛出。是栈特有的异常。 - OutOfMemoryError
Java虚拟机无法申请到足够的内存时抛出。除了程序计数器外,其他部分的JVM内存都会抛出该异常。例子:
- 堆溢出:不断创建对象(如通过递归)或者创建很大的对象
解决办法:通过内存映像分析工具对Dump出来的堆转储快照进行分析,重点确认内存中的对象是否是有必要的,也就是确定到底是出现了内存泄露
(对象没必要存在,需要调整代码)还是内存溢出
(对象需要存在,需要调整JVM堆内存大小配置)。 - 栈溢出:当栈出现异常时,内存太小(OutOfMemoryError)还是已使用的栈空间太大(StackOverflowError),并没有明确的界限,两者有重叠。单线程情况下,无论是栈帧太大还是虚拟机容量太小,都抛出StackOverflowError异常。而多线程时,线程栈占用内存一定时,创建线程数量太多,就会抛出OutOfMemoryError。此时,则需要相应地减小每个线程占用的栈来创建更多线程。
- 方法区:1. 运行时常量池中字符串常量太多;2. 调入的类文件太多;
- 堆溢出:不断创建对象(如通过递归)或者创建很大的对象
- StackOverflowError
-
Exception
- Checked异常:(Exception的子类中,除了RuntimeException子类体系的异常,
编译异常
)
必须显示处理(注意,不一定非用throw才能抛出)
处理方式:
1、不知如何处理,定义异常所在方法时,需使用throws声明抛出该异常(表示该函数不能解决这个异常,也就是说,函数本身不能处理时,必须让别人知道自己不能处理)
2、知道如何处理,在异常可能出现的地方,使用try-catch检查并捕获处理 - Runtime异常:(Exception中的RuntimeException子类体系,
运行时异常
)
无需显示处理
处理方式:
系统自动向上抛出,若遇到程序显示编写的对应处理方式,则对其进行处理,否则最终抛给JVM
- Checked异常:(Exception的子类中,除了RuntimeException子类体系的异常,
特点
- Throwable及其所有子类都具有可抛性
即他们都可以被throw和throws操作 - JAVA自己给出的Error和Exception的子类都以Error和Exception作为后缀名,可读性强
- 从发生异常的地方,创建异常对象,将其抛给调用目前程序的地方,给调用者处理,调用者处理不了,就一直向上抛出,直至抛给JVM,抛给DOS控制台显示
- 用户可以自己定义异常类
- 自定义异常类需要继承异常体系(Exception/RuntimeException->对应Checked异常和Runtime异常),从而可被throw/throws抛出
- 自定义异常类类名以Exception结尾,以便于识别
- 子类覆盖父类方法时,子类方法抛出的异常只能是父类异常本身或其子类
因为要确保处理父类异常的所有函数还能处理子类异常
throw和throws的区别
- throws
含义: 对本函数内可能抛出的异常类的声明,即告知他人本函数内部对该异常不作处理(一种静态的告知)
语法: 出现在函数名上,后面接1个或多个异常类名,逗号隔开
使用场景: 想告知他人本函数内部对该异常不作处理时用
其中,对Checked异常不作处理时,必须用
注意:如果函数内部有try-catch语句对异常进行了处理,虽然编译通过,并且可以对异常进行捕获并处理,但是含义上矛盾 - throw
含义: 抛出异常对象(一种动态的行为)
语法: 出现在函数内部,可以单独使用,后面接1个异常对象
使用场景: 系统无法对该异常自动抛出,需要程序员手动抛出时使用
异常处理的位置
在出错最初出现的语句上使用try-catch处理(即在异常出现的最上层的函数上处理异常),之前调用的各个函数上使用抛出
语句
- try-catch-finally
a) try块必须有,且只有1个
b) catch和finally可选,但是至少有一个
c) catch可以有多个
d) finally必须位于所有catch之后,且只能有1个
e) try, catch, finally后必须有{ },即使只有一条语句
c) 从Java7开始,一个catch块可以捕获多种类型的异常,多种异常用|
隔开 - try
作用: 存放运行时可能出现异常的代码 - catch
作用: 捕获并处理运行时可能出现的异常 - finally
作用: 通常用于关闭(释放)资源
性质:- 想用finally,必须和try-catch语句一起使用,但是try-catch语句可以没有finally try-finally :异常无法直接处理,但是资源需要关闭
- 不论是否有异常,执行完try-catch语句后必定会执行,除非finally前是System.exit(0); 即退出JVM
- 当try块或catch块中遇到return或throw语句,会先查找是否有finally语句,有,则先跳转执行finally的语句,执行完后才转会执行自己的return或throw
参考文献:
[1] https://blog.csdn.net/youngstar70/article/details/62227032