异常处理
什么是异常?
异常是指程序在运行过程中,出现的不正常情况,程序运行时如果出现异常,将会中断正在执行的程序。
异常并不是错误,它只是程序在运行过程中出现的不正常情况。
异常按类型可分为两种:
1. 运行时异常 RuntimeException
用户操作不当造成,这一类异常是可以避免的,系统并不是强制要求处理,只要用户正确操作就可避免。
常见运行异常:
1.1 输入异常:(用户输入的数据格式不匹配)
java.util.InputMismatchException
1.2 数组下标越界:(数组下标超出了限定的范围)
java.lang.ArrayIndexOutOfBoundsException
1.3 数学运算异常(一般是计算是除数为0)
java.lang.ArithmeticException:/ by zero
1.4 空指针异常(对象没有初始化,就对该对象进行操作,此异常最为常见)
java.lang.NullPointerException
2. 受检查异常
这一类异常,是由于程序设计原因造成,用户无法避免,用户必须进行处理,否则程序无法运行。
如下图,使用时间类Date时出现的异常。
当对程序中异常进行处理以后,程序可以继续运行,不会因为异常而中断
而处理方式系统也给出了两种:
第一种:使用throws向上抛出异常
谁调用产生异常的方法,谁处理异常。
总之,往上抛就够了。
代码举例如下:
public void show() throws 异常类型1,异常类型2{
}
public void show() throws Exception{
throw new Exception("xxxx");
}
在开发中,为了方便调试代码,我们也会自己抛出异常。
throws关键字,用于声明方法要抛出异常。
throw关键字,用于在代码中,手动抛出异常。
第二种:try/catch
代码举例:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入成绩:");
try {
//可能会出错的代码
int score = sc.nextInt();
System.out.println("成绩是:"+score);
}catch (InputMismatchException ex) {
//解决方案
System.out.println("程序出现在异常,原因是用户输入的格式不匹配");
}
System.out.println("程序结束");
}
①当try块中代码,正常运行没有异常时,那么不会进入catch块
②当try块中的代码出现异常,系统就会自动匹配catch的异常类型,如果类型一致,那么将执行catch块中的代码。
③catch块可以编写多个,用于获取不同类型的异常,代码举例如下:
try{
}catch(异常类型1 ex){
}catch(异常类型2 ex){
}catch(异常类型3 ex){
}finally{
//此处的代码,是程序在最后必须要执行的代码(不论有没有异常,此处代码一定运行)
}
难点:如果在代码中,有return,又有finally,如果return在finally之前,那么会先执行return,还是finally?
执行代码如下:
public static void main(String[] args) {
Lx1 obj = new Lx1();
int age = obj.shouAge();
System.out.println("年龄是:"+age);
}
public int shouAge() {
try {
System.out.println("try块的代码正在运行");
return 23;
}catch(Exception ex) {
System.out.println("catch块的代码正在运行");
ex.printStackTrace();
}finally {
System.out.println("finally的代码运行");
}
return 0;
}
注意,在代码的最后需要再return一个初始返回值,不然try中的return的返回值可能会丢失。
运行结果如下:
try块的代码正在运行
finally的代码运行
年龄是:23
可以看到,第一个执行的是try块中的代码,但是return并没有被执行;
第二个执行的finally,最后才是return的返回值。
所以,finally无论如何都是先于return执行的。
注:最大的异常只能放在最后面,不能放前面。
在处理异常时,一般要把异常打印在控制台,方便调试。
一般在finally中释放资源。