黑马程序员-JAVA-常见异常与基本处理

——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的执行流程

Created with Raphaël 2.1.2 开始 try块执行 try块正常执行完成? 正常进入finally块 try块出现异常? try块异常被捕捉? 异常e进入catch块 异常e进入finally块 中断r进入finally块 yes no yes no yes no

catch的执行流程

Created with Raphaël 2.1.2 开始 catch块执行 catch块正常执行完成? 正常进入finally块 中断r进入finally块 yes no

finally的执行流程

Created with Raphaël 2.1.2 开始 finally块执行 finally块正常执行完成? finally前有未处理异常和中断? 返回并携带try或者catch块中的未处理异常和中断 正常返回 返回并携带finally块中的未处理异常和中断,注意:try或者catch块中的未处理异常和中断将被抛弃 yes no yes no

你可能感兴趣的:(学习,黑马)