异常处理机制
一、Error:错误
1、造成原因:
(1)JVM 资源耗尽
(2)JVM系统内部错误
2、Error不需要编写代码去处理
二、Exception:例外(异常)
1、造成原因:是编程错误以及外在的一些因素造成的。如:
(1)数组角标越界
(2)数学计算异常
(3)链接中断
(4)试图读取的文件不存在
(5)空指针异常
(6)输入类型不匹配类型
三、异常的处理机制
1、Java程序如果在执行过程中产生了异常,会自动创建一个Exception类,该类会被自动提交(submit)给Java的运行时系统(运行时系统在虚拟机中用于监控),这个过程被称为抛出异常。运行时系统以日志的形式输出异常信息,并且中止程序的执行。
2、异常处理机制---抓抛模型
(1)
try{
//尝试去捕捉异常(选定异常范围)
}catch(Exception e1){
//对捕获到的异常对象进行处理
//catch(特定异常类型)中可以精准的捕获异常
}catch(Exception e2){
//catch代码块可以定义多个
}finally{
//finally代码块总会被执行到,使用再必须要执行的代码,比如释放输入输出流
}
(2)
throws 上抛异常(抛到调用这个方法的地方),最终必须要又异常处理的方法,如果一直上抛相当于并没有处理异常。异常上抛将一直上抛到异常处理位置,这一过程我们称之为捕获异常。其实真正的抛出异常是发生在异常代码处。
格式如下:
public static void 方法名 throws Exception ;
3、语法的错误不是异常
四、Throwable类
1、Throwable是一个大类,内包括Error、Exception两个类
2、Exception中包括RuntimeException(unchecked)和checked两种
(1)RuntimeException(运行类)其子类都是非受检异常,是代码的问题,不需要抛出异常。一般解决方法是修改代码。
(2)除了RuntimeException其他异常类都叫做受检异常,必须将其抛出或解决,否则编译不通过。通常不是代码的错误,比如:读取文件时文件不存在,链接断开。
3、异常处理机制使用时机:发生受检异常,不是代码的问题的时候使用。
五、注意
1、在Throwable类中
(1)子类再覆写父类中的方法时,不能抛出比父类方法更高更广的异常
(2)存在多个catch时,子类异常必须写在父类异常上面的catch
2、如果在try中写System.exit();则会跳过finally代码块(直接退出);
六、自定义异常
1、自定义异常时,所有异常必须都是Throwable的子类
2、自定义异常式,必须继承一个异常父类
3、throw是手动抛出异常(throws是上抛异常)
七、开发注意
1、对于实际的开发中不能直接去捕获Excetion(不允许),应该更加明确其子类异常。
2、不要生吞异常:如果异常不抛出,也没有输出到日志,程序在后续之中以不可控的形式结束,这样就会造成判断不了时哪里出现了异常,以及什么原因造成了异常,增加了排查问题的可能性
3、涉及到资源的时候必须子啊finally中释放资源
4、最小化 try{}catch{}
Try-catch代码段会产生额外的性能开销,会影响JVM对代码的优化,建议捕获有必要的代码,不允许直接大try包裹主所有代码