java异常体系:
Throwable是所有异常和错误的超类。两个子类Error和Exception分别表示错误和异常。Error是程序无法处理的,JVM一般会选择终止退出;Exception是程序可以捕获并处理的,Exception分为检查异常和非检查异常(也称运行时异常)。
- Checked Exception:Java语言规定必须在程序中对Checked Exception进行处理,编译器会对此作出检查。
- Runtime Exception:编译器不会检查程序是否对运行时异常做了处理,在程序代码中也不必捕获运行时异常的对象,也不必在方法体中声明抛出运行时异常。它表示的是编程发生了错误,需要去找出错误修改代码,而不是捕获异常。
java异常处理机制
- try关键字: 后面紧跟一个代码块,try块放置可能引发异常的代码。
- catch关键字: 对应一个异常类型和一个代码块,catch块中即是错误处理代码。
- finally关键字: finally块总是在方法返回前执行,用于回收一些物理资源。
- throw关键字: 抛出一个具体的异常对象。
- throws关键字: 主要在方法签名中使用,用于声明可能抛出的异常。
java异常处理流程
- 抛出(throw)异常:try块中的业务功能实现代码出现异常,系统自动生成一个异常对象,异常对象提交给Java运行时环境。
- 捕获(catch)异常:Java运行时环境接收异常对象后,寻找处理该异常对象的catch块。
完整的异常处理语法
1.当前方法明确知道该如何处理异常,则程序应该使用try...catch块来捕获异常,然后在对应的catch块中修复异常。
try{
//业务实现代码
}catch(SubException e){
//异常处理代码
}finally{
//异常发生,方法返回之前,总是要执行的代码
}
当Java程序执行try块、catch块时遇到return或者throw语句,系统不会立刻结束该方法,而是寻找异常处理流程是否包含finally块。如果没有包含finally块,程序立即执行return或者throw语句,方法终止;如果包含finally块,系统立即开始执行finally块,执行完finally块之后再次跳回来执行try块、catch块里的return或者throw语句。
2.当前方法不知道如何处理这种异常,则在定义方法的使用声明抛出该异常。该异常由上一级调用者处理。
throws ExceptionClass1,ExceptionClass2...
3.程序自行抛出异常
throw ExceptionInstance;
如果throw语句抛出的异常是Checked异常对象,则该语句必须位于try块里,显示捕获该异常;或者放在一个带throws声明抛出的方法中,交由方法调用者处理。
如果throw语句抛出的异常是Rutime异常,可以完全不理会该异常。