异常概述与异常体系结构
异常:在Java语言中,将程序执行中发生的不正常情况称为异常(开发过程中逻辑与语法错误不说异常)
Java程序在执行过程中所发生的异常可分为两类:
- Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误,资源耗尽等严重情况。比如:StackOverflowError和OOM。
- Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理。如,空指针访问,试图读取不存在的文件,网络连接中断,数组角标越界等
常见异常
运行时异常:
- IOExpection(io异常)
- ClassNotFoundException(文件找不到)
编译时异常:
- NullOointerException(空指针异常)
- ArrayIndexOutOfBoundsException(数组下标越界异常)
- ClassCastException(强制类型转换异常)
- NumberFormatRException(数字格式异常)-————将String类型转化为int类型时失败。
- InputMismatchExceptyion(输入不匹配异常)
- ArithmeticException(算术异常比如发生除0操作)
异常的处理
抓抛模型
一、“抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的一个对象。并将此对象抛出。
一旦抛出对象之后,其后的代码就不再执行。
二、“抓”:可以理解为异常的处理方法
- try-catch-finally
- throws
异常处理机制一:try-catch-finally
try{
//可能出现的异常代码
}catch(异常类型1 变量名1){
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式2
}catch(异常类型3 变量名3){
//处理异常的方式3
}
//………………
finally{
//一定会执行的代码
}
异常处理中常用的两个方法:getMessage()和printStackTrace()
注意:
- finally不一定要出现。
- 用try将可能出现异常的代码包起来,如果在执行过程中,一旦出现异常,就会生成对应的异常对象,和catch中对象类型进行匹配。
- 一旦匹配成功,就会进入catch中进行异常处理,处理完成之后,就会跳出当前的try-catch结构(没有写finall的情况下)。再继续执行后续代码。
- catch中异常类型,父类异常不能出现在子类异常上面,不然无法匹配子类异常。若无子父类关系,则无顺序要求。.
- finall中声明的一定会被执行,即使catch中又出现了异常,try中有return语句,catch中有return语句等情况。
- try-catch-finall结构可以循环嵌套使用。
- 像数据库连接,输入输出流,网络编程Socket等资源,JVM不能进行自动回收,我们需要手动的进行资源的释放,此时资源的释放,就需要声明在finall中。
使用try-catch-finally处理编译时异常,程序将不在编译时报错,但运行时仍有可能出错。
异常处理机制二:throws
异常处理方法二:throws + 异常类型
- throws + 异常类型写在方法的声明处,指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行的时候,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会抛出异常。异常代码后续的代码,并不会被执行。
- 往上抛异常,实际并未被处理(真正处理的还是try-catch)
方法重写规则:
- 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
手动抛出异常:throw
关于异常对象的产生:
- 系统自动生成的异常对象
- 手动的生成一个异常对象,并抛出(thow)
thow new + 异常类型
用户自定义异常类
- 自定义异常类继承于现有异常结构(RuntimeException、Exception)
- 提供全局常量:serialVersionUID
- 提供重载构造器