异常处理机制


一、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包裹主所有代码

原文地址:https://www.cnblogs.com/JQbiu/p/10801900.html