Java异常

概念

程序在运行过程中出现的特殊情况(中断当前程序的执行)
异常处理的必要性:
任何程序都可能存在大量的未知问题、错误;如果不对这 些问题进行正确处理,则可能导致程序的中断,造成不必要的损失。

类型

java.lang包下的Throwable类及其子类

  1. Error类(错误)
    JVM、硬件、执行逻辑错误,不能手动处理
  2. Exception类(异常)
    程序在运行和配置中产生的问题,可处理
    其中------RunTimeException类,运行时异常,可处理,可不处理
    --------CheckedException类,受查异常,必须处理
Throwable类常用方法

public Throwable getCause():返回此Throwable对象的原因cause,若cause不存在或未知,返回null
public String getMassage():返回此Throwable 对象的详细信息
public void printStackTrace():将此Throwable对象的堆栈跟踪输出至错误输出流,作为字段System.err的值

异常的产生
  1. 自动抛出异常
    thtow new 异常类();
    当程序运行时遇到不符合规范的代码或结果时,会产生异常,对于这样的异常需要进行捕获处理
  2. 手动抛出异常
    类型 方法名 (参数列表) throws 异常类1,异常类2…{ }
    方法声明抛出异常
    方法声明后的 throws 异常类1,异常类2…是该方法可能产生的异常的类型
  3. 产生异常结果
    相当于遇到return语句,导致程序因异常而终止
异常的传递

按照方法的调用链反向传递,如始终没有处理异常,最终会由 JVM进行默认异常处理(打印堆栈跟踪信息)
向上抛出,不会放弃

异常的处理

抛出异常------->捕获异常----->异常处理
try {
可能出现异常的代码
} catch(Exception e) {
异常处理的相关代码,如:getMessage()、printStackTrace()
} catch(Exception e) {

} catch(Exception e) {

}

finally{
无论是否出现异常,都需执行的代码结构,常用于释放资源
}
执行过程:
(1)首先,逐一执行try块中的语句,如果没有产生异常,跳过所有的catch块,执行finally块以及其后的语句
(2)如果ry块中的语句产生异常,跳过try块后续程序,进入catch块,与catch块逐一匹配,找到对应的异常处理程序并执行完,再执行finally块以及其后的语句,其他的catch块不会被执行
(3)若果catch块没有匹配的异常处理程序,将该异常抛给JVM处理,再执行finally块,但其后的语句不再执行
注意:
catch的形参是Exception或其子类,父类靠后(子到父)
catch和finally必须有一个
finally里的语句一定会执行
在catch或try块遇到return,finally在return之前执行;
Throws抛出异常的规则

  1. 不可查异常(运行时异常):Error、RunTimeException或它们的子类
    可以不使用throws 关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出
    自动抛出异常 ---- 允许程序自动忽略
  2. 受查异常:除了Error、RunTimeException或它们的子类以外的类
    处理:
    (1)用try-catch语句捕获
    (2)用throws语句声明将其抛出(到方法外)
    否则会导致编译出错----二选一
    此处的异常分类
    (1)方法本身的异常
    (2)某个调用的方法
    (3)JVM抛出的异常
自定义异常

必须继承自Exception或Exception的子类,常用RuntimeException
必要提供的构造方法:
(1)无参数构造方法
(2)String message参数的构造方法

方法覆盖

带有异常声明的方法覆盖:
(1)方法名、参数列表、返回值类型必须和父类相同
(2)子类的访问修饰符合父类相同或是比父类更宽
(3)子类中的方法,不能抛出比父类更多、更宽的异常

return与finally

finally子句作为try-catch-finally的第三部分,无论是否捕获异常或处理异常,finally子句都会被执行。但是try语句出现return语句,情况会变复杂
(1)如果try子句中没有产生异常,则一直执行到return语句,包括return语句中的表达式,并在返回值已经确定的情况下先跳转至finally子句,执行完毕再返回
(2)如果try子句中产生异常,则异常之后的try语句不再执行,直接跳转到catch语句继续执行。如果catch子句中有return语句,则与上述相似,一直执行到return语句,包括return语句中的表达式,并在返回值已经确定的情况下先跳转至finally子句,执行完毕再返回
(3)如果finally语句中有return语句,则一定会从该return语句返回,其他return语句不会被执行
(java在finally语句放return语句会产生一个warning)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值