Java异常体系
Throwable:Java异常体系中的根类。
Error:主要描述了系统内部错误等重大问题,此类问题一旦出现程序员通常也无能为力,一般不要求解决。
Exception:除了它的特殊子类RuntimeException外,Exception描述的都是编译时被检查的异常,称为可检查异常。
RuntimeException:程序运行时产生的异常,RuntimeException异常一旦发生,程序会终止运行,所以对其可以不进行声明和捕捉。
捕获异常
try块:
- 将可能产生异常的代码放在try块中,try块中的代码会被检测。
- try块不能单独出现,其后要么接着catch块,要么接着finally块,要么接着catch-finally块。
- try块带来的好处是,将功能代码与检查错误的代码分离。
catch块:
- 处理try块捕获到的异常。
- 可以有多个catch块,若捕获到异常会从最上面的catch块开始匹配,所以应该将具体的异常放在上面。
- 在catch块中除了可以做一些处理动作,还可以抛出异常。
- 若捕获了异常,而没有catch块与之匹配,那么此异常会抛给JVM处理。
finally块:
- 无论try块是否捕获到异常,finally块内的代码一定会被执行,通常将释放资源之类的动作放在其中。
- finally块不会被执行的特殊情况:System.exit(0)JVM退出、在finally内部发生未处理的异常。
try-catch-finally的一般格式:
try {
// 需要检测的代码
} catch(Exception1 e1) {
// 处理异常的代码
} catch(Exception2 e2) {
// 处理异常的代码
} finally {
// 无论发生异常与否,都需要运行的代码
}
try-catch语句可以嵌套使用,在关闭流资源时就经常在finally块中嵌套try-catch语句。
抛出异常
throws:
- throws用来声明某方法有可能抛出异常,格式:throws 异常类型列表。
- 如果方法可能抛出的异常为 非可检查异常(即RuntimeException、Error),不需要声明。
- 若父类方法用throws声明了可能抛出异常,子类在覆盖该方法时声明的异常不能超出父类所声明的异常(可以不声明)。
- 子类在覆盖父类方法时,不能声明父类方法没有声明的异常,但是可以不声明任何异常。也就是说,如果父类方法没有声明异常,子类在覆盖父类方法时也不能声明异常。例子:Thread类中的run()方法。
throw:
- 只能出现在方法体内,用于抛出一个具体的异常对象。
- throw语句后的代码不会被执行到。
- throw一个可检查异常后,要么在方法体内捕获该异常,要么在方法上声明该异常。
常见异常
可检查异常:
FileNotFoundException:找不到文件异常
EOFException:文件结束异常。
ClassCastException:类型转化异常。
NoSuchFieldException:找不到域异常。
NoSuchMethodException:找不到方法异常。
IllegalAccessException:非法访问异常。
RuntimeException异常
IndexOutOfBoundsException:角标越界异常。
NullPointException:空指针异常。
ClassNotFoundException:找不到类文件异常。
ArithmeticException:算术异常。
SecurityException:安全异常。
自定义异常
如果Java提供的异常类不足以描述遇到的问题,可以定义自己的异常类。将定义好的类继承Exception或者RuntimeException即可称为异常类。在使用方式上与Java内置的异常基本一致。
(本文用到的图片来自互联网)