1.异常有两种分法 :
1) 按照程度来分
1) Error
2) Exception
2) 按照处理来分
1) 受检异常 在程序中必须对其进行检查处理的异常
Exception及其子类 (RuntimeException及其子类除外)
2) 非受检异常 在程序中不是必须对其进行检查处理的异常
Error及其子类 过于严重
RuntimeException及其子类 过于轻微
2.异常的处理 :
1) 捕获, 在可能抛出异常的语句上捕获.
try {
可能出异常的语句
} catch (可能的异常类型 异常对象) {
处理异常(打印异常信息)
} catch (可能的异常类型2 异常对象) {
处理异常(打印异常信息)
} catch (Exception e) {
通用的捕获(打印异常信息)
} finally {
此处代码一定要执行,不论前面有没有return
}
有三种组合 : try catch , try catch finally, try finally
打印异常信息常用的方法有三种:
① e.printStackTrace();
② System.out.println(e.getMessage());
③ System.out.println(e);
这里有一点需要注意,finally{}代码块中的代码是一定要执行的,即使前面有return语句,也会先执行finally{}代码块中的语句,再返回去执行return。正是由于finally的这种特性,一般在finally中写关闭资源的代码。
2) 抛出 , 方法声明中使用throws 可能的异常类型. 在方法中如果真的要抛出异常,使用throw 异常对象!
3) 捕获后再抛出, 方法中先尝试执行代码, 如果捕获到了异常, 把异常包装成自定义异常, 再抛出, 这样抛出的异常永远可以保持类型的一致性
3.throws 与throw的区别:
throws只是声明可能会抛出异常,并不一定抛出异常,它是声明在方法签名上的,并且可以声明多个异常。在继承时子类抛出异常的范围要比父类的小。
public void r() throws Exception1,Exception2{
}
throw 写在方法中,构成语句,的是真的抛出异常对象,这个异常对象一般是自定义异常。
throw new MyException("自定义异常!");
4.自定义异常
public class MyException extends Exception(){
public MyException(String message){
super(message);
}
public MyException(Exception e){
super(e);
}
}
由上面代码可以看出,写自定义异常时,通常会继承父类Exception,然后编写本异常类带参构造器,在带参构造器中调用父类的带参构造器。
5.异常处理还可以分成两种:
积极的:try...catch...finally
消极的:throws
throw关键字,是属于手动抛出异常对象。
6.异常处理的选择 :
底层方法要尽量抛出。
顶层方法要尽量捕获 , 入口方法。
by Karl