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

来源:互联网 发布:郑州php机构 编辑:程序博客网 时间:2024/06/06 08:39

——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块yesnoyesnoyesno

catch的执行流程

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

finally的执行流程

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