异常(Exception)
创始人
2024-02-14 03:32:43
0

随着面向对象的结束,我们的JavaSE也就接近了尾声,还有两个章节没有去梳理,常用类和异常,本章先讲异常,剩下的常用类后面再来补。

废话不多说,直接开始本章的内容。

1. 认识异常

引出: 假设 num1(值为10)/ num2(值为0)这一行代码被执行,那么程序就会崩溃,继而抛出异常:ArithmeticException. 后面的代码不执行。

对我们而言,它只是不小心输入了一个0 作为分母,被一个不算致命的错误导致了整个程序崩溃,是不是不值得?

于是提出了异常、异常处理机制。

在Java中,将程序执行过程中发生的不正常行为称为异常,例如上述提到的

ArithmeticException(算术异常)

ArrayIndexOutOfBoundsException(数组越界异常)

NullPointerException(空指针异常)

我们来看个例子:

从上述过程中可以看到,java的异常,都有与其对应的类来进行描述。

2 异常的体系结构

这是从知乎上找到的一张图;

这是jdk1.8 手册上的;

从上图中我们可以知道:

Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
Error(错误):指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生回力乏术。
Exception:其他因编译错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件等等。

异常的分类

异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为:
1. 编译时异常
在程序编译期间发生的异常,称为编译时异常,也称为受检查异常(Checked Exception)
2. 运行时异常
在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常(Unchecked Exception)
RunTimeException以及其子类对应的异常,都称为运行时异常。比如:NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException。

小结:

🐔异常分为两大类运行运行时异常和编译时异常。

🐔运行时异常编译器检测不出来,一般指编译器的逻辑错误,程序员应该处理。

🐔对于运行异常可以不做处理,因为很普通咯全处理可能影响程序的可读性和运行效率异常时。

🐔编译时异常则必须做处理。

常见的运行时异常:

1. NullPointerException

当然应用程序是否再需要对象的地方使用null时抛出异常。

2. ArithmeticException 

当出现异常的运算条件时,抛出此异常。

3.  ArrayIndexOutOfBoundsException

当访问数组时,访问的下表超出数组的范围,抛出此异常。

4. ClassCastException

当试图将对象强制类型转换为不是实例的子类时,抛出异常。
5. NumberFormatException

 当试图将字符串转化成一种数值类型,但该字符串不能转化为适当格式时抛出异常。

例如:

3 异常的处理

1. try - catch - finally

try - catch - finally在idea上的快捷键为:ctrl + Alt + t

程序员在代码中捕获的异常,自行处理

语法如下:

         try {} catch (Exception e ) {} finally {

解释如下:

try {//可能存在异常的代码
} catch (Exception e /* ”异常类型 参数变量 “,是什么类型就写什么类型,变量可以是任意名字 */) {//当发生异常时,将异常封装Exception 对象e,传给catch,得到异常对象后,程序员自行处理//如果try代码块中的代码没有异常的话,那么catch块中的代码将不执行} finally {//无论rty代码块是否发生异常,finally代码块都必须执行
}//finally块一般用于释放资源,例如IO流中文件的关闭}

 tyr - catch 注意事项

1. 可以没有finally

2. 如果异常发生了,异常代码后的代码就无法执行,直接跳到catch块

3. 不发生异常则不进入catch

4.有多个catch语句,捕获不同的异常(进行不同的业务操作),要求父类异常要在子类异常之后。

例如: Exception类在NullpointException之后

2. 异常的抛出:

在编写程序时,如果程序中出现错误,此时就需要将错误的信息告知给调用者,比如:参数检测。
在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者。具体语法如下:

throw new XXXException("异常产生的原因");

【注意事项】
1. throw必须写在方法体内部
2. 抛出的对象必须是Exception 或者 Exception 的子类对象
3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译
5. 异常一旦抛出,其后的代码就不会执行

3. throws 处理机制

1. try - catch - finally  和 throws 只能二选一使用

2. 没有显示是处理异常则默认是 throws

4.  自定义异常

自定义异常的步骤:

1. 定义类:自定义异常类名(自己写)必须继承Exception 或者 RuntimeException

2. 如果继承Exception,则属于编译异常

3. 如果继承RuntimeException,则属于运行异常

例如:

public class Main {public static void main(String[] args) throws AgeException {int age = 10;if ( ! (age >= 18) && age <= 120) {throw new AgeException("年龄需要在18~100岁之间");}System.out.println("正确");}
}public class AgeException extends Exception{public AgeException() { //无参构造器}public AgeException(String message) { //有参构造器super(message);}
}

throw 和 throws 的区别

意义位置后面接的东西
throw异常处理的一种方法方法声明处异常类型
throws手动生成异常对象的关键字方法体中异常对象

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...