异常小结
异常体系结构呈树状,如图所示:
一、Error是程序中无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,java虚拟机(JVM)一般会选择线程终止。
Exception是程序本身可以处理的异常,它分为运行时异常和非运行时异常,也成为可检查异常(Checked Exception)和不可检查异常(Unchecked Exception)。
1、运行时异常都是RuntimeException类及其子类异常。这些异常是不可检查异常,程序中可以选择捕获处理,也可以不处理。这一般有程序逻辑错误引起的。应尽量避免发生。
2、非运行时异常是RuntimeException以外的异常。类型上都属于Exception类及其子类。必须要处理,不处理的话,编译就不会通过
try{ }catch(异常类型 异常的变量名){ //可能会出现的异常 }finally{ //异常不管是否发生,方法返回之前,总是要执行的代码,释放资源。 } //可能会产生异常的程序代码 //处理异常代码 try{ }finally{ } //不处理异常
1、try语句块中的代码受到异常监控,如果try中的某条语句出现异常,则程序直接进入catch块进行匹配。
2、try块中出现异常而不处理则之后的所有语句不会再执行。
3、可以同时出现过个catch语句块,用来处理不同的异常。 使用多个catch块是,一定要注意,先捕获子类,后捕获父类。匹配一个之后,后面的就不进行匹配了。
4、catch语句带一个Throwable类型的参数。
5、finally语句块总是会在方法返回前执行,这个语句总是会执行的。
二、throw 关键字,用于手动的抛出异常,用于方法体内部,用来抛出一个Throwable类型的异常。
申明非RuntimeException类型的异常要再在方法上抛出,或者使用try-catch处理。
public static void test3() throws Exception{
//抛出一个检查异常
throw new Exception("方法test3中的Exception");
}
RuntimeException e = new RuntimeException("你输入的不正确");
throw e;
三、throws关键字,用于方法体的外部,用来申明可能出现的异常,。
在方法上申明异常,申明之后该方法不用处理异常,调用该方法的程序处理异常。
四、自定义异常
1、定义一个类继承RuntimeException或者Exception。实现其中的构造方法。2、项目开发时,不建议使用自定义异常。因为可读性差,而且java提供的异常已经基本够使用了。
五、Throwable类中的常用方法
getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。
getMessage():返回异常的消息信息。printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。
六、 异常处理的一般原则
1、 能处理就早处理,抛出不去还不能处理的就想法消化掉或者转换为RuntimeException处理。
因为对于一个应用系统来说,抛出大量异常是有问题的,应该从程序开发角度尽可能的控制异常发生的可能。
2、 对于检查异常,如果不能行之有效的处理,还不如转换为RuntimeException抛出。
这样也让上层的代码有选择的余地――可处理也可不处理。
3、 对于一个应用系统来说,应该有自己的一套异常处理框架,这样当异常发生时,也能得到统一的处理风格,