——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
异常处理的由来
在应用的开发和使用过程中,总有些因素是我们无法控制的,也有些特殊情况虽然可以预见,但是却无法完美的避免。程序运行有时,不是,应该说经常碰到意料之外的状况。有时,我们应该停下程序,仔细查找问题并修复;有时却没有这个条件,我们希望程序能从意料之外的状况返回正常状态并继续执行。
Exception异常处理正是为此而生。
异常Exception和错误Error
如上述,特殊情况有的严重有的相对较轻,严重的错误应该阻止他进一步破坏数据,较轻的可以尝试恢复到正常状态。
为此,Java中分别定义了Error和Exception来区别这两者。Error用于指示合理的应用程序不应该试图捕获的严重问题,比如StackOverflowError堆栈溢出。Exception它指出了合理的应用程序想要捕获的异常状况。他们都是Throwable的子类,只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。最后,它还可以包含 cause(原因):另一个导致此 throwable 抛出的 throwable。因为 cause 自身也会有 cause,依此类推,就形成了异常链,每个异常都是由另一个异常引起的。
RuntimeException
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。这意味着定义一个RuntimeException在语法上将被编译器忽略对它的强制抛出、捕获声明要求。即所谓Unchecked异常。
Error也是Unchecked的,但是不同的是RuntimeException的捕获是可选的。
一般的异常处理
一般来说,应该精确的捕获catch异常,合理分析异常信息,清理工作区间内容,然后返回正常运行状态,如果当前无法处理,则应处理掉可以处理的部分,重新包装异常抛出(或是简单的抛出原异常),最后,在finally块中释放外部资源。
大致如下:
try{
//do something
}catch(SomeException e){
//handle e
}catch(AnotherException e2|OtherException e3){
//handle e2 & e3
//can't handle?
throw new PackedException("info");
}catch(Exception e){ // NOT SUGGUESTED!!!
}finally{
//close resources
}
常见异常
NullPointerException 大概是最常见的异常了 空指针
ArithmeticException 算术异常,整数除以0会发生
IndexOutOfBoundsException 数组下标越界异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
NumberFormatException - 数字格式异常
UnsupportedOperationException - 不支持的操作异常
IO异常
IOException是失败或中断的 I/O 操作生成的异常的通用类。通常与外部设备状态或是权限有关。
FileNotFoundException 文件不存在
FileLockInterruptionException 当某个线程正在等待获取文件锁定时被另一个线程中断
UnsupportedEncodingException 不支持字符编码。
SocketException 底层协议中存在错误,如 TCP 错误
UnknownHostException 指示主机 IP 地址无法确定而抛出的异常。通常是DNS问题
CharacterCodingException 出现字符编码或解码错误
SQL异常
SQLException 提供关于数据库访问错误或其他错误信息的异常
try-catch-finally的执行顺序
流程中的中断可以指跳出try-catch-finally块的break,continue,return 或者未处理异常,包括throw
try的执行流程
catch的执行流程
finally的执行流程