14、异常

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45536396/article/details/102736245

异常

一、异常的概念

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 异常类名(“实参”);

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_45536396/article/details/102736245