一、Java异常
在程序运行过程中,如果环境检测出一个不可执行的操作,就会出现运行时错误。例如,如果使用一个越界的下标访问数组,程序就会产生一个ArrayIndexOutOfBoundsException运行时错误。
在Java中,异常会导致运行时错误。异常就是一个表示阻止执行正常进行的错误或者情况。如果异常没有处理,程序就会非正常终止。
Java异常类层次结构图
Java中Error和Exception都继承自Throwable
Error:错误,不可处理
Exception:异常,可以处理
二、异常分类
Java中异常分为checked exception和runtimeException
runtimeException:Java编译器不会检查,也就是说,程序中可能出现这种异常,但编译器不会报错,能通过。
checked exception: 除runtimeException以外的异常都属于checked exception,在遇到这种类型异常,我们必须自己处理,否则无法通过编译器。
三、异常处理机制
在Java中,异常处理机制为:抛出异常,捕获异常
抛出异常:Java中抛出异常可以在方法体里采用throw关键字抛出异常,也可以在方法签名上通过throws关键字抛出异常。
1.throws抛出异常
语法格式:方法名 throws Exception1,Exception2,...{}
注:使用throws抛出的异常,如果调用者不想处理该异常,可以继续向上抛出,但最终需要有能够处理该异常的调用者。
throws抛出异常规则
1)如果是运行时异常,可以不抛出,编译能通过,但会产生运行时错误。
2)必须声明方法可能抛出的可查异常。即一个方法可能出现非运行时异常,要么使用try-catch处理,要么使用throws抛出,如不处理,将编译错误。
3)一个方法抛出了异常,该方法的调用者就得处理或抛出异常。
4)覆盖一个方法时,不能声明跟覆盖方法不同的异常。声明的异常必须跟覆盖方法声明的异常同类或其子类。
throw抛出异常
throw抛出异常在方法体中,程序会在throw语句后终止,其后面的语句执行不到。
捕获异常:try,catch,finally
try-catch语句:try{}catch(Exception e){}
try块中写可能抛出异常的代码块,catch捕获抛出的异常并处理。
注:try中可能抛出不同异常,可以有多个catch块,Java会捕获抛出的异常与catch块中匹配,运行其中代码。
try-catch-finally:try{}catch(Exception e){}finally{}
try-catch一样,finally其中代码不管是否有异常总会执行。
小结
try块:用于捕获异常,其后可接多个catch块。
catch块:用于处理try块捕获的异常。
finally块:无论是否捕获或处理异常,其中代码总会执行。当try块,catch块中遇到return语句时,finally将会在return前执行。
try,catch,finally语句块执行顺序
1)当没有 捕获到异常时,try中语句依次执行,程序将跳过catch块,执行finally块中语句。
2)当捕获到异常,但是没有catch到该异常时,finally中语句依然会被执行,最后会运行错误。
3)当捕获到异常时,并catch到该异常,try中出现异常前代码依次执行,到抛出异常语句跳到catch块中依次执行其中语句,最后执行finally中语句。