JAVA学习之异常处理

异常

异常介绍

基本概念
Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常。)
执行过程中所发生的异常可分为两大类
1)Error(错误):Java虚拟机无法解决的严重问题,如:JVM系统内部错误,资源耗尽等严重情况。比如:StackOverflowError[栈溢出]和OOM(Out of memory),error是严重错误,程序会崩溃。
2)Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理。例如:空指针访问,试图读取不存在的文件,网络连接中断等等,Exception分为两大类:运行时异常(程序运行时,发生的一场)和编译时异常(编程时,编译器检查出的异常)。
异常体系图
image
总的来说就是Error和Exception都继承了Throwable类,之后Error后又有一堆子类,而Exception有一个子类为RuntimeException,为运行时异常,它后面的子类就只处理运行时异常,与RuntimeException同一级层的就是编译时异常,但并没有相应类,而是直接各种类型的编译时异常继承Exception。

常见的一些运行时异常

1)NullPointerException空指针异常
当应用程序试图在需要对象时,使用null,抛出该异常。
2)ArithmeticException数学异常
当出现异常的运算条件时,抛出此异常。例如:一个整数“除以0”时,抛出此类的一个实例。
3)ArrayIndexOutofBoundsException数组下标越界异常
用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
4)ClassCastException类型转换异常
当试图将对象强制转换为不是实例的子类时,抛出该异常。例如下:
image
a的实例为B类,所以强转成C类时会抛出该异常,向下转型,必须为相同实例,才能转型。
5)NumberFormatExcepton数字格式不正确异常
当应用程序试图将字符串转换成一种数值类型,但该字符串不能装换成适当格式时,抛出该异常=》使用该异常,我们可以确保输入是满足条件数字。

异常处理

基本介绍
异常处理就是当异常发生时,对异常的处理的方式。
处理方式:
1)try-catch-finally
程序员在代码中捕获发生的异常,自行处理。
image
try中的语句,会执行到异常的语句,之前的语句会执行,之后的语句不会执行。
finally可以省略。
2)throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。
image

try-catch-finally

使用细节:
1.try中异常发生语句及其之后的语句不会执行,异常发生前的语句都会执行。
2.同一个try和多个catch使用时,首先时catch中子类写在父类前面,也就是Exception类写在最后。其次,在1的条件下,还是只会捕获一个异常,只不过是根据异常类型,选择性的进入catch语句进行处理。异常后即使还有异常,但第一个异常发生后,之后的语句不会执行。
3.try和finally连用时,无catch,这种做法相当于没有捕获异常,执行完finally的语句后,程序仍会中断。

throws

基本介绍:
1)如果一个方法可能会生成某种异常,但是并不能确定如何处理这些异常,则此方法应显示的声明抛出异常,表明该方法将不对这些异常进行处理,而有该方法的调用者负责处理。
2)在方法声明中用throws语句可以声明抛出异常的列表,可以是方法中产生的异常类型,也可以是其父类。
使用细节:
1.对于编译异常,程序必须显示的处理,如果抛出,则必须在调用方法处继续抛出或者捕获异常。
2.对于运行时异常,程序默认是throws抛出的,程序员可以不用处理。
3.子类重写方法时,对于抛出类型规定,子类抛出类型要么和父类抛出类型一致,要么时父类抛出类型的子类。
4.throws中,如果有方法捕获异常了,则视为处理异常了,就没必要再抛出了。
5.方法中抛出异常后,方法中剩下的语句不再执行,直接返回到调用该方法的方法中去,如果有返回值的话,默认不修改。

自定义异常

自己定义类名,继承Exception(编译时异常)和RuntimeException(运行时异常)。
写上构造器,构造器参数只需要一个字符串传入,之后调用super(name),用父类构造器即可。
默认一般都定义运行时异常。

throw和throws的区别

image

posted @ 2023-05-19 14:59  逆天峰  阅读(27)  评论(1编辑  收藏  举报
作者:逆天峰
出处:https://www.cnblogs.com/gcfer//