1.java的异常分类
Throwable: 是所有异常的根,java.lang.Throwable
Error类(错误):是程序无法处理的错误,一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。你最好不要期望它出现,如果出现了,你的程序差不多彻底挂了,可以把它看成是程序终结者。
Exception类(异常):是程序本身可以处理的异常。一般是编码,环境,用户的输入等出现问题。它一般分为Checked异常和Runtime异常(运行时异常),所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则称为CheckedException。(检查异常,或非运行时异常)。
运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
2.处理异常
try-catch以及try-catch-finally
try{
//一些会抛出异常的方法
}catch(Exceptoin e){
//处理异常的代码快
}
如果try抛出异常,首先抛出异常的方法会终止执行,然后程序的控制权将被移交给catch块中的异常处理程序。catch块中的代码,可以根据不同的业务,选择不同的处理方式。例如输出一个警告,或记录错误日志。例如语句e.printStackTrace();可以打印异常的具体信息。在catch块语句执行完后,在其外面的语句会顺序执行。
当try块中抛出很多种异常,可以运用多重catch块,来捕获多种不同类型的异常,并对其作出相应的处理。如果出现异常并且已成功匹配一个后catch语句,执行catch语句时,仅执行完成匹配的catch语句块。
编写多重catch语句块需要注意顺序问题。
一定要按照先小后大,也就是先子类,后父类的顺序编写catch语句块。因为当程序抛出异常时,异常处理系统会就近寻找匹配的异常处理程序,子类继承父类,对于父类的异常处理程序,子类也是适用的。
当catch块处理好后异常后,有时还需要作一些善后工作,例如,关闭连接,关闭一些已经打开了的文件。我们就通过finally语句块来做这些善后工作。
finally是在try块,catch块的return语句执行完之后,返回主调函数之前执行的。无论try块是否抛出异常,catch块是否成功匹配异常,finally语句块都会执行。try块不能独立存在,必须和catch或finally同存。