14、异常

异常

一、异常的概念

1. 概念:程序运行过程中出现的一切非正常的现象统称为异常。

2. 异常处理的必要性:程序中不可避免的都会存在很多的错误,问题,这些问题必须要处理,不处理就会对用户造成一定的损失,所以必须要处理。

3. 异常的分类

a) Throwable:所有异常的父类 在java.lang包下。
方法
String getMessage():返回异常信息的字符串内容。
void printStackTrack():打印异常追踪站的详细信息。
b) Throwable
1. Error:错误 程序运行中出现的依靠程序无法解决的问题
如:JVM的内存不足| 内存栈溢出
可以不处理
2. Exception:异常
a. RuntimeException:运行时异常,未检查异常
编译时不报错,编译器不会检查,运行时报错,对于此种异常可以避免,所以可处理可不处理
运行时异常直接|间接继承于RuntimeException
只要继承于RuntimeException都属于运行时异常
b. 非RuntimeException:已检查异常
编译器会检查,编译时会报错,对于此种异常必须要处理,否则编译不通过。
没有直接|间接继承RuntimeException,直接或间接的继承Exception都属于已检查异常

c) 常见的未检查异常|运行时异常

1. 空指针异常 NullPointerException

2. 数组下标越界异常 ArrayIndexOutOfBoundsException
3. 类型转换异常 ClassCastException

4. 数字格式异常(数据类型转换异常) NumberFormatException
5. 数学异常 ArithmeticException: / by zero

二、异常的产生

1. 自动产生异常

程序运行时遇到出错的代码,自动的产生异常,程序运行因异常而终止。

在这里插入图片描述

2. 手动产生异常

语法:throw new 异常类名(“实参”);
位置:方法中,手动抛出异常
相当于return语句,程序终止,后面的代码执行不到

在这里插入图片描述

三、异常的传递

沿着方法的调用链反向传递,直至传给main函数,main函数传递给JVM,JVM会抛出产生的异常。

在这里插入图片描述

四、异常的处理

1. 声明异常(消极的处理异常)

语法: throws 异常名
位置: 方法声明的最后面
只是消极的处理异常,只会让程序编译通过,并没有真正的解决异常,程序同样会因为异常而终止。可以通过一个父类的异常接受所有的子类异常。

在这里插入图片描述

方法的定义语法
修饰符 返回值类型 方法名(参数标) throws 异常名1,异常名2…异常名n{
//方法实现
}

2. 捕获异常(积极的处理异常)

语法
try{
//可能出现异常的代码
}catch(捕获的异常 e){
//处理异常的代码
}
try{}
catch(){}
catch(){}
catch(){}
注意
1. 当程序运行过程中产生了一个异常,会将捕获的异常逐一和catch块中的异常进行
匹配,当匹配上哪一个catch块中的异常会执行相应的异常处理的代码。
2. 可以使用catch(父类异常 e)来捕获异常,能够捕获的异常类型为父类异常+所有的
子类异常
3. 如果使用父类捕获异常,那么必须将父类异常的捕获放置在catch块的最后一个。

五、finally

finally中的代码是无论如何都必须要执行的代码

try{
//可能出现异常的代码
}catch(捕获的异常 e){
//处理异常的代码
}finally{
//必须要执行的代码
}
注意:finally中的代码是不管何种情况都会执行的语句,如果将return语句放置在finally中,则返回的是finally中的return语句。一般情况下不会将return语句放置在finally语句中;一般放置的是释放资源的代码,后续会详细讲解。
try-catch-finally的常用结构
try{}catch(){}catch(){}catch(){}
try{}catch(){}finally{}
try{}finally{}
try{try{}catch(){}}catch(){}
try{try{}catch(){}finally{}}catch(){}
try{try{}catch(){}}catch(){try{}catch(){}finally{}}finally{}
try{}catch(){}finally{try{}catch()finally{}}
注意:
1. try块不能单独存在,必须和catch|finally块配合使用
2. 如果try-catch-finally都存在,必须将finally放在最后。
3. try后面如果出现finally,只能出现一个。
final–finally–finalize的区别

五、自定义异常类

1. 写一个类,继承一个现有的异常类

如果想要让这个异常类成为一个运行时异常则继承RuntimeException
如果想要让这个异常类成为一个已检查异常则继承Exception

2. 提供两个构造方法

一个无参的构造方法,一个带有String类型的参数的构造方法

3. 在需要提供异常的地方直接通过throw new 异常类名(“实参”);

六、方法覆盖的要求(完整版)

方法名,参数表,返回值相同

访问修饰符子类和父类相同或者子类比父类更宽

子类不能比父类抛出更多更宽的异常

(不能单纯的从父类和子类的数量上来,只要子类抛出异常的范围比父类异常相同或者窄就行)

3. 在需要提供异常的地方直接通过throw new 异常类名(“实参”);

六、方法覆盖的要求(完整版)

方法名,参数表,返回值相同

访问修饰符子类和父类相同或者子类比父类更宽

子类不能比父类抛出更多更宽的异常

(不能单纯的从父类和子类的数量上来,只要子类抛出异常的范围比父类异常相同或者窄就行)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值