异常

在Java等面向对象的编程语言中,异常本身是一个类
产生异常就是创建异常对象并抛出了一个异常对象。
Java中处理方式为中断处理

以下情况会抛出异常:
  • 调用了一个会抛出 checked 型异常的方法(除了ErrorEx 和 RunTimeEx之外的),如FileInputStream构造器
  • 检测到错误,利用 throws 抛出一个 checked 型异常
  • 编写的程序出现错误
  • JVM或者运行时库出现问题

前两个异常开发人员必须明白,否则当前线程会终止

java的内部错误(从Error继承)不需要在函数后面像 IOException 声明,
异常的产生过程:

二、异常的处理

java处理异常的五个关键字:try, catch, finally, throw, throws

2.1抛出异常throw

作用:

使用throw关键字在指定的方法中抛出指定的异常

使用格式:

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

注意:
1.throw关键字必须写在方法的内部
2.throw关键字后边new的对象必须是Exception或者Exception的子类
3.throw关键字抛出指定的异常对象,就必须处理这个异常对象

throw关键字后边创建的是RuntimeException或者RuntimeException的子类对象,我们可以不处理,默认交给JVM处理
throw关键字后边创建的是编译异常,我们就必须处理这个异常,要么throws,要么try...catch...

4.子类抛出的异常只能是更特定的,比如 父类抛出了IOEx,子类不能抛出 IOEx的超类的异常声明
5.父类如果没有抛出 checked 型异常,子类也不可以抛出checked 型异常(如果不是checked型呢??)

2.2声明异常throws

作用:
当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象,
可以使用throws关键字处理异常对象,把锅抛给JVM处理 --> 中断处理

使用格式:

修饰符 返回值类型 方法名(参数列表) throws AAAException{
    throw new AAAException("产生原因");
}

注意:

1.throws必须写在方法声明处

2.throws后面声明的异常必须是Exception或者Exception的子类

3.方法内部如果抛出多个异常,throws后面也必须声明多个异常,
如果抛出的多个异常对象有父子类关系,直接声明父类

4.调用了一个声明异常的方法,就必须处理声明异常,
要么继续使用throws声明抛出,最终交给JVM
要么try...catch...自己处理异常

2.4捕获异常try...catch

格式:

try {
    可能产生异常的代码
}catch(定义异常的变量,用来接收try中抛出的异常对象) {
    异常的处理逻辑,之后是如何处理异常对象
    一般工作中,会把异常的信息记录到一个日志中
}
...
catch(异常类名 变量名) {

}

注意:
1.可以抛出多个异常对象,可以使用多个catch
2.try中产生异常,执行catch,之后继续执行try...catch之后的代码
如果try中没有产生异常,就不会进入catch,执行完try直接执行后续代码

image.png

try...catch与throw的区别:
try...catch可以执行后续程序
throw则是中断程序

2.5finally代码块

一定要执行的代码
无论异常发生不发生,都需要执行
而且出现程序跳转,部分代码会执行不到

格式:

    try{
        ...
    }catch() {
        ...
    }
    ...
    catch() {
    
    }finally {
        //无论是否异常均会执行的代码
    }

注意:
1.finally必须和try一起使用
2.finally一般用于资源释放,程序最后均要资源释放
image.png

三、异常注意事项

1.多个异常分别处理

image.png
还可以执行后续代码

2.多个异常,一次捕获(try),多次处理(catch)

image.png

catch里边定义的异常变量,如果有父子类关系,那么子类的异常变量必须写在上边,否则报错(与多态知识相关)

image.png
对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),
当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。

3.多个异常一次捕获一次处理

image.png
catch中定义的变量可以接收try中的所有异常对象。

运行时异常被抛可以不捕获也不处理,给JVM(中断程序)

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

有return语句的话,永远返回finally中的结果

image.png

 public static int demo4() {
        int i = 0;
        try {
            return i;
        } finally {
            i = 12;
            System.out.println("finally trumps return.");
            return i;
        }
    }
    //输出结果
    finally trumps return.
    12  

5.子父类异常

①如果父类抛出多个异常,子类重写父类方法时,抛出
和父类相同的异常
或者父类异常的子类
或者不抛出异常
②父类方法没有抛出异常,子类重写时也不可以抛出异常,只能捕获处理,不能声明抛出

(父类异常什么样,子类异常就什么样)
image.png

经典面试题!!!!!!


    public static int demo5() {
        try {
            return printX();
        }
        finally {
            System.out.println("finally trumps return... sort of");
        }
    }
    public static int printX() {

        System.out.println("X");
        return 0;
    }
    
    //输出结果
    X 
    finally trumps return... sort of 
    0

waikiki
4 声望2 粉丝