异常体系的特点: 异常体系中所有的类以及建立的对象都具有可抛性。
throw定义在函数内,用来抛出异常对象。 throws定义在函数上,用于抛出异常类。
当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上(throws)声明,否则编译失败。
特殊:当函数中抛出RuntimeException异常,函数上可以不用声明。
如果函数声明了异常,需要调用者进行处理。处理方法为 try或者 throw。
1,编译时被检测异常 该异常在编译时,如果没有处理(没有抛也没有try),编译失败。 该异常被标识,代表这可以被处理。 2,运行时异常(编译时不检测) 在编译时,不需要处理,编译器不检查。 该异常的发生,建议不处理,让程序停止。需要对代码进行修正。
异常处理语句: try { 需要被检测的代码; } catch () { 处理异常的代码; } finally { 一定会执行的代码; } 有三个结合格式: 1. try { } catch () { } 2. try { } finally { } 3. try { } catch () { } finally { }注意:finally 内定义大部分是用于关闭资源,finally的代码是必须要执行的,除了执行 system.exit(0);jvm关闭,finally不会执行下去
定义类继承Exception或RuntimeException。 原因:为了让该自定义类具备可抛性、让该类具备操作异常的共性方法。 (参考:)
/* 定义一个圆形和长方形,当输入参数小于等于零时异常 */ class NoValueException extends RuntimeException //程序停掉 { //自定义异常 public NoValueException(String message) { super(message); } } interface shape //定义一个接口 { void getArea(); } //圆形面积 class Circle implements shape { public static final double PI = 3.1415926; private int radius; Circle(int radius) { if (radius<=0) new NoValueException("出现非法值"); this.radius = radius; } public void getArea() { System.out.println(radius*radius*PI); } } //长方形面积 class Rec implements shape { private int len,wid; Rec(int len , int wid)//throws NoValueException { if (len<=0 || wid<=0) throw new NoValueException("出现非法值"); this.len = len; this.wid = wid; } public void getArea() { System.out.println(len*wid); } public static void main(String[] args) { Rec Area = new Rec(-1,10); Area.getArea(); Circle c = new Circle(3); c.getArea(); } }异常的好处:正常流程代码和问题代码相分离,方便进行阅读,故没有采用if语句。
异常的处理原则: 1,处理方式有两种:try 或者 throws。 2,调用到抛出异常的功能时,抛出几个,就处理几个。 一个try对应多个catch。 3,多个catch,父类的catch放到最下面。 4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。 也不要不写。 当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。