java 异常处理
java 异常处理
1、java异常处理机制的优点:
- 把各种不同类型的异常情况进行分类, 用 java 类来表示异常情况,这种类被称为异常类,把异常情况表示成异常类,可以充分发挥类的扩展和重用的优势。
- 异常流程的代码和正常流程的代码分离,提高了程序的可读性,简化了程序的结构。
- 可以灵活的处理异常,如果当前方法有能力处理异常,就捕获它,否则只是抛出异常,由方法调用者来处理它。
2、异常处理对性能的影响:
- 一般来说,在 java 程序中使用 try ... catch 语句不会对应用的性能造成很大的影响。仅仅当异常发生时java 虚拟机需要执行额外的操作,用来定位异常处理的代码块,这时会对性能产生负面影响。如果抛出异常的代码块和捕获异常的代码块位于同一个方法中这种影响会小一些;如果 java 虚拟机必须搜索方法调用栈来寻找异常处理代码块,对性能的影响就比较大了,尤其当异常处理代码块位于调用栈的底部时,java 虚拟机定位异常处理代码就需要大量的工作。
- 如果当前方法具备处理异常的能力就自行处理,不要把异常推给调用方去处理。
3、异常处理的语法规则:
异常处理语句主要涉及到:try 、catch、finally、throw 和 throws 关键字。
- try ... catch: 语句用于捕获异常,try {...} catch (Exception e){...}
- finally: 任何情况下都必须执行的代码(进程被kill、系统宕机除外)
- throws: 如果一个方法可能会出现异常,但是没有能力处理异常,可以在方法申明处用 throws 子句来申明异常。
- throw: throw 语句用于抛出异常。
语法规则:
- try 代码块不能 脱离 catch 代码块或者 finally 代码块而单独存在。 try 后面至少有一个 catch或者 finally 代码块
- try 后面可以有零个或多个 catch 块, 还可以有 0个 或至多一个 finally代码块。
- 如果 try 后面有多个 catch 块, Java 虚拟机会把异常和各个catch 块的申明的异常类型匹配,如果异常为某个异常类型或其子类的实例,就执行这个catch 块, 而不会执行后面其他的catch块。
- 如果程序运行到 catch 代码块 抛出异常时,catch内部的代码块没有捕获异常,剩下的代码将不会执行,程序将向上抛出异常。
- 在执行 try 或 catch 代码块中的 return 语句时, 假如有 finally 代码块, 会先执行 finally代码块。
- finally 虽然在 return 之前被执行,但是finally 代码块不能通过重新给变量赋值的方式来改变 return 语句的返回值。
- 建议不要在 finally 代码块中使用 return 语句,因为它会导致以下两种潜在的错误:
- 第一种错误:覆盖 try 或者 catch 代码块中使用的 return 语句
- 第二种错误:异常丢失
public static int test(){
try {
return 1 / 0;
} catch (Exception e) {
throw new Exception()
} finally {
return 100;
}
}
public static void main(String[] args){
try {
test()
}catch(Excption e){
System.out.println(e.getMessage)
}
}
按理来说 main() 方法的 catch 代码块应该捕获该异常, 但是由于test() 方法的finally 代码块有返回值, 将导致异常被丢失。
4、异常处理类
所有异常处理类的祖先类是: java.lang.Throwable类,他的实例表示具体的异常对象,可以通过 throw 语句抛出。常用方法:
- getMessage(): 返回String类型的异常信息
- printStackTrace: 打印跟踪方法调用栈而获得详细的异常信息,在程序调试阶段,此方法用于调试错误。
Throwable他的直接子类是 Error 和 Exception
Error类: 表示仅靠程序本身无法恢复的严重错误,建议终止程序。
Excption类: 表示程序本省可以处理的异常。