1.方法重写中的异常
原则:子类声明的异常范围不能超过父类声明范围。
- 父类方法没有声明异常,则子类重写方法也不能声明异常。
class Parent {
public void show(){}
}
class Child extends Parent {
public void show() throws Exception {} // 编译错误
}
- 如果父类抛出一个异常,那么子类只能声明父类的异常或该异常的子类。
class AAException extends Exception {}
class BBException extends AAException {}
class Parent {
public void show() throws AAException {}
}
class Child extends Parent {
// public void show() {} // 不声明异常,编译通过
// 声明父类方法异常的父类,编译错误
// public void show() throws Exception {}
// 声明与父类方法相同的异常或该异常的子类,编译通过
// public void show() throws AAException {}// 编译通过
public void show() throws BBException {}// 编译通过
// 子类声明的异常可以有多个,但是都必须是父类方法相同的异常或该异常的子类
public void show() throws BBException, AAException {}// 编译通过
}
2.异常链
异常需要封装,但是仅仅封装还是不够的,还需要传递异常。一个系统的友好型的标识,友好的界面功能是一方面,另一方面就是系统出现非预期的情况的处理方式了。
有时候我们会捕获一个异常后再抛出另一个异常,这就形成了一个异常链。
【示例】异常链案例
// 自定义异常
class DenominatorZeroException extends Exception {
public DenominatorZeroException() {}
public DenominatorZeroException(String msg) {
super(msg);
}
}
// 计算器类
class Calculator {
// 除法运算
public static int division(int num, int den) throws DenominatorZeroException {
int result = 0;
try {
result = num/den;
}
catch(ArithmeticException e) {
// 抛出一个更详细的异常
throw new DenominatorZeroException("分母不能为0");
}
return result;
}
}
public class ExceptionTest07 {
public static void main(String[] args) {
try {
// 两个数做除法运算,可以会发生算数异常
Calculator.division(5, 0);
} catch (DenominatorZeroException e) {
e.printStackTrace();
}
}
}
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。