JAVA——异常与错误
异常
异常(Exception)又称为例外,是指在程序运行过程中发生的非正常事件,这些事件的发生会影响程序的正常执行。
- 数字中“无意义”的运算,例如除数为零、对负数求对数平方根等
- 对数组进行操作时,超出了数组的最大下标
- 程序所需进行的I/O操作不能正常执行,如所需访问的文件不存在
- 内存耗尽无法进行类的实例化
- JVM崩溃
Java异常体系
- Throwable
– 所有错误或异常的超类
– 只有对象是此类(或子类之一)的实例时,才可throw - Exception
– Exception类及其字类是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件,表示程序本身可以处理的异常
– IOException
– NoSuchMehtodException
– CertificateException - Error
– 仅靠程序本身无法回复的严重错误,用于指示合理的应用程序不应该试图捕获的严重问题
– NoClassDefFoundError
– OutOfMemoryError
– VirtualMachineError - RuntimeException
– 可能在Java虚拟机正常运行期间抛出的异常的超类。
– 当程序中可能出现这类异常时,即使没有用try…catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过。
函数异常声明
- 声明异常的语法(必检异常)
返回类型方法名称(参数列表) throws 异常列表
– 实例
void compute(int x) throws
IllegalArgumentException,
ArithmeticException {
...
}
– 注意
子类覆盖了父类的某一方法,那么该子类方法不可以被其覆盖的父类方法抛出更多的异常(但可以更少)
捕获异常
try{
// 可能会产生异常的代码
} catch (某Exception类型 e) {
// 处理该异常类型的代码
} finally {
// 最后一定会被执行的代码
}
- 从上到下分别对每个catch语句处理的例外类型进行检测,直到类型匹配为止
- catch语句的排列顺序应该是从子类到父类
- 对于处理不了的异常或要转型的异常,在方法的声明处通过throws语句抛出异常。
异常处理
- 如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,Java虚拟机会从出现异常的方法代码块中往回找,直到找到处理该异常的代码块,将异常交给相应的catch语句处理。
- 如果Java虚拟机追溯到方法调用栈最底部main()方法时,仍没有找到处理异常的代码块,将按照下面的步骤处理:
- 调用异常的对象的printStackTrace()方法,打印方法调用栈的异常信息。
- 如果出现异常的线程为主线程,则整个程序运行终止;如果非主线程,则终止该线程,其他线程继续运行。
异常处理注意事项
- 不要轻易的忽略捕获的Exception
- 不要简单地捕获顶层的Exception
– 错误的例子