一、异常是什么?
是对问题的描述,对问题进行对象的封装,符合java一切皆对象的设计思想。
二、异常的体系结构
Throwable
|--Exception
|--RuntimeException
|--Error
异常体系的源头为Throwable类,主要包括Exception和Error两大体系。用人体疾病来做类比就是,Error是不可治愈的疾病,例如癌症,不可以进行处理;Exception是可治愈的疾病,例如小感冒,可以通过程序进行处理。
都可以被关键字throws和throw进行操作,也只有异常体系具有此特点。
三、throws和throw的用法
throw定义在函数内,用来抛出异常对象;throws定义在函数上,用来抛出异常类,可以抛出多个异常类;
若抛出的异常对象有父子关系,父异常应该在子异常后面抛出。
当函数内容中有throw抛出异常对象,却没有进行try处理异常的时候,应该在函数上throws出异常类。当然,若出现的异常是RuntimeException及其子类,就不需要在函数上throws出异常类,只需要在函数内throw抛出异常对象就可以了。
如果函数上声明了抛出异常类,有两种处理方式:可以继续throws抛出;也可以try进行处理。
四、异常的种类,有两种
- 编译时被检测异常:该异常在编译时,如果既没有throws,也没有进行try处理,那么编译失败;
- 运行时异常(编译时不进行检测):在编译时不需要处理,在编译时也不需要检查,在该异常发生时,不需要处理,让程序停止,让调用者认识到错误的发生,从而修改代码。
五、异常处理的语句格式
- try{}catch(){}
- try{}finally{}
- try{}catch(){}finally{}
注意:finally中一般用来释放资源句柄,只有处在System.exit(0)语句之后时才不执行,其他情况一定会执行。
六、自定义异常
一般继承Exception或者RuntimeException,前者定义编译时异常,后者定义运行时异常
七、一个自定义异常的小例子
class NoValueException extends RuntimeException{
public NoValueException(String message){
super(message);
}
}
interface Shape{
abstract public double area();
}
class Rectangle implements Shape{
private double length;
private double width;
public Rectangle(double length,double width){
if(length<=0 || width<=0)
throw new NoValueException("出现非法值!");
this.length=length;
this.width=width;
}
@Override
public double area() {
// TODO Auto-generated method stub
return this.length*this.width;
}
}
public class ExceptionDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
double area = new Rectangle(-100, 10).area();
System.out.println("长方形的面积为:"+area);
} catch (NoValueException e) {
// TODO: handle exception
System.out.println(e.toString());
}
}
}
一个小小的总结。~<>~