异常体系
Throwable |---Error |---Exception |---RuntimeException
异常格式
try { //可能出现异常的代码 } catch () { //对异常的处理 } finally { //一定执行的代码,通常用于释放资源 }
相关方法
String getMessage() //异常信息
String toString() //异常名称:异常信息
void printStackTrace() //异常名称,异常信息,异常出现位置
throw和throws
- throw使用于函数内,抛出异常对象
- 当问题可处理时,需在函数体上声明throws [抛出的异常类型],一方面告诉调用者可能发生的异常要进行捕捉,另一方面当调用者不处理时直接让程序编译出错,让可能发生的问题提前暴露,否则不声明throws会将问题带到运行时期。
自定义异常
- 当程序中出现特有含义的问题时,根据面向对象的特点,将问题封装成自定义异常类,这样可以让抛出的异常更具体,相应的处理方式也更具体。自定义异常类要继承自Exception。
- 自定义异常类在构造时,由于父类已经定义好了关于异常信息的处理方式,因此只需将异常信息通过super(message)传递给父类,实现对异常信息的记录和获取。
class MyException extends Exception { /*Exception中对异常信息的处理 private String message; Throwable(String message) { this.message = message; } public String getMessage() { return message; } */ //子类只需直接调用初始化异常信息 FuShuException(String msg) { super(msg); } }
RuntimeException和Exception的区别
- RuntimeException是运行时异常,当异常发生后,考虑到调用者无法进行处理,希望程序直接停下来,对代码进行修正,这时就可以抛出该异常或者自定义子类异常,这类异常不用在函数体上声明。
- Exception是编译时异常,当异常发生后,判断到调用者可以处理,就抛出该异常或者自定义子类异常,这类异常需在函数提上声明,要求调用者处理。
异常在子父类覆盖中的特点
- 子类覆盖父类异常函数,子类不能比父类发生更多异常。
- 若父类抛出异常,子类覆盖时,只能抛出父类异常或者该异常的子类。
- 若父类抛出多个异常,子类覆盖时,只能抛出父类异常的子集。
包
- 包与包之间可以使用的权限只有public和protected。
- 不同包之间的访问,被访问包中的类和类中的成员,需要被public修饰。不同包中的子类,还可以直接访问父类中被protected修饰的成员。
public protected default private 同一个类 ok ok ok ok 同一个包 ok ok ok 子类 ok ok 不同包 ok