异常的格式
//第一种
try{
//需要被检测的代码,比如除数有可能为0的这种代码
}catch(){
//处理当发生异常代码
}
//第二种
try{
}catch(){
}finally{
//一定会执行的代码(通常是关闭资源的,因为资源必须被释放)
//finally只有一种情况不会执行,当前一行有System.exit(0);则不会执行
}
//第三种
try{
}finally{
}
异常体系:
Throwable
|-Error
|-VirtulMachineError(虚拟机运行错误)
|-Exception
|-RuntiemException(运行时异常)
|-NullPointerException(空指针异常)
|-ArithmeticException(算术异常)
|-ArrayIndexOutOfBoundsException(数组下标越界异常)
- 异常体系的特点:
异常和错误的区别是,异常时可以被处理的,而错误是没法处理的。
异常体系中的所有类以及建立的对象都具有可抛性,也就是说可以被throw 和throws关键字所操作,只有异常体系具备有这个特点。 - 检查异常和非检查异常(对javac来说)
Checked Exception:
检查异常除了Error和RuntimeException的其他异常。这样的异常一般是由程序的运行环境导致的。如SQLException、IOException、ClassNotFoundException 等。当函数上当有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。
比如:
而RuntimeException和其子类异常除外,也就是说,函数内涂过抛出RuntimeException或其子类异常,函数上可以不用声明,也可正常编译通过。
Unchecked Exception:
非检查异常有Error和RuntiemException以及他们子类,在javac编译时,不会提示发现这样的异常。因为这样的异常多半是代码写的有问题。应该修正代码,而不是去通过异常处理器处理。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。
throw 和throws的用法
throw定义在函数内,用于抛出异常对象
throws定义在函数上,用于抛出异常类。可以抛出多个异常,用逗号隔开即可
异常处理原则
处理方式有两种:try 或throws
调用到抛出异常的功能时,抛出几个,就处理几个 一个try对应多个catch
多个catch,父类的catch放到最下面。catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace输出语句,也不要不写,当捕获到的异常,本功能处理不了时,可以继续在catch中抛出.
try{
throw new AException();
}catch(AException e){
throw e;
}
自定义异常
定义类继承Exception 或则RuntimeException
1. 为了让自定义异常具有可抛性
2. 让该类具备操作异常的共性方法
当要定义自定义异常的信息是,可以使用父类已经定义好的功能
异常信息传递给父类的构造函数
class MyException extends Exception{
MyException(String message){
super(message);
}
}
自定义异常,按照java的面向对象思想,将程序中出现的特有问题进行封装,将正常流程代码和问题处理代码相互分离,方便阅读。
在子父类覆盖时,子类抛出的异常必须是父类异常的子类或者子集
如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。