异常概述
异常:异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。简单来说就是程序出现了不正常的情况。
异常本质就是Java当中对可能出现的问题进行描述的一种对象体现。
常见异常:
除数不能为0异常(ArithmeticException)
空指针异常(NullPointException)
数组越界异常(ArrayIndexOutOfBoundsException)
类型转换异常(ClassCastException)
异常分类
Error:称为错误,由Java虚拟机生成并抛出,程序对其不做处理。
Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。
RuntimeException:运行时期异常,又称为非受检异常,RuntimeException及其所有子类都是运行时期异常。
编译时期异常:不是继承自RuntimeException的Exception的子类都称为编译时期异常。
严重错误: 在程序执行的整个阶段,都可发生错误,错误是无法解决的,可以避免,例如: StackOverflow
遇到异常,是如何处理的呢?
处理异常的目的: 并不是为了修复程序的错误,而是就算程序出现了错误,也能够让程序继续执行
jvm默认是如何处理异常的?
以下段编码为例:
public static void main(String[] args) {
int a = 1;
int b = 0;
System.out.println(a / b);
}
public static void show() {
show();
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.kookv.kookv0425.main(kookv0425.java:8)
1.打印错误信息
a.异常名称 java.lang.ArithmeticException
b.异常的消息 / by zero
c.异常所发生的方法位置 at com.kookv.kookv0425.main
d.异常所在Java文件中 kookv0425.java
e.异常发生行号 8
2.终止程序
System.exit(0);
当JVM处理异常的方式不能够满足我们开发的需求,就需要我们自己处理异常。
我们自己如何来处理异常呢?
方式一: try...catch..finally
方式二: throws
处理异常方式一格式:
try{
//程序可能出现问题的代码
}catch(异常类 异常名){
//异常处理的代码
} finally{
//释放资源
}
注意:
1.try块区的代码越少越好。
2.try块中一旦发生异常,那么后面所有的代码都不会被执行。
3.多个catch块只会执行一个。
4.Exception接受异常必须放在异常的最后面,满足先子类后父类。
异常的执行流程:
1.程序执行到错误行,系统会创建一个异常对象,并且抛给我们:
ArithmeticException exp = new ArithmeticException("/by zero");
throw exp;
2.程序进入catch块进行逐个匹配
匹配成功,程序执行catch块代码
ArithmeticException ae = exp;
Exception e = exp;
匹配失败,交给jvm处理
处理异常的标准方式:
1.能够显示处理的尽量显示处理,提高程序的可读性。
2.但是一定要在异常处理的最后加上 父类Exception处理。
Throwable类
1.Throwable是所有异常和错误的父类。
2.只有作为Throwable或者它的子类对象才能够由Java虚拟机抛出,或者可以由Java throw语句抛出
3.只有这个类或其子类可以是catch子句中的参数类型
4.异常的本质就是对错误信息的一种对象体现
throws关键字概述
在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用者进行处理。
throws使用格式
[修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2....]{
}
注意:
1.在main方法中,不能throws抛出。因为main方法是虚拟机调用,虚拟机处理异常的结果是将程序终止,不满足我们对处理异常的本质需求。
2.当一个方法抛出的是编译时异常,调用者必须处理。
3.throws可以同时声明多个异常。
4.当一个父类方法抛出一个异常,重写方法不能够被扩大。
5.throws表示异常出现的一种可能性。
6.多个平级异常的处理方式:使用“,”隔开多个异常。
throw和throws的区别
有了throws关键字为什么需要throw? -- 异常出现的情况做相应的处理,throws只是一种异常的声明
抛出异常对象: throw 异常对象;
throws和throw的区别:
1.throws出现方法的声明上,throw出现在方法体内。
2.throws表示异常出现的一种可能性,throw表示方法一定出现了异常。
3.throws可以声明很多个异常,throw只能够抛出一个异常对象。
4.throws声明的是异常类,throw抛出的是异常对象。
finally修饰的代码块一定会被执行,除非在执行到finally之前程序异常退出或者调用了系统退出的方法。
finally用于释放资源,在IO流操作和数据库操作中会见到。
finally相关的面试题
简述final,finally和finalize的区别。
finally碰到return
finally一定会执行
执行顺序?
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果。
因此,即使finally中对变量x进行了改变,但是不会影响返回结果。它应该使用栈保存返回值。
为什么需要自定义异常?
1.系统提供的异常不能满足我们的所有需求。
2.我们认为的异常并不是和别人认为的异常一样,本质就是一种错误异常。
自定义分数异常: 自定义一个异常,要求考试成绩必须在0-100之间,如果不在这个范围内,抛出异常。
自定义异常的步骤
1.自定义异常必须是Throwable的子类,但又因为错误不能够处理,所以我们一般继承Exception或者RuntimeExecption
2.书写构造方法
a.无参构造方法
b.带message消息的有参数构造方法