4、如何自定义异常
自定义异常通常继承于 Exception 或 RuntimeException,到底继承那个应该看具体情况来定。
自定义受控异常:
public class ExceptionTest {
public static void main(String[] args) {
try {
method1(10, 0);
} catch (MyException e) {
// 必须拦截,拦截后必须给出处理,如果不给出处理,就属于吃掉了该异常
// 系统将不给出任何提示,使程序的调试非常困难
System.out.println(e.getMessage());
}
}
private static void method1(int value1, int value2) throws MyException { // 如果是受控异常必须声明
if (value2 == 0) {
throw new MyException("除数为 0");
}
int value3 = value1 / value2;
System.out.println(value3);
}
}
// 自定义受控异常
class MyException extends Exception {
public MyException() {
// 调用父类的默认构造函数
super();
}
public MyException(String message) {
// 手动调用父类的构造方法
super(message);
}
}
自定义非受控异常:
public class ExceptionTest {
public static void main(String[] args) {
method1(10, 0);
}
private static void method1(int value1, int value2)
// throws MyException
{
if (value2 == 0) {
// 抛出非受控异常,方法可以不适用 throws 进行声明
// 但也也可以显示的声明
throw new MyException2("除数为 0");
}
int value3 = value1 / value2;
System.out.println(value3);
}
}
// 自定义非受控异常
class MyException2 extends RuntimeException {
public MyException2() {
// 调用父类的默认构造函数
super();
}
public MyException2(String message) {
// 手动调用父类的构造方法
super(message);
}
}
5、方法覆盖与异常
方法覆盖的条件:
子类方法不能抛出比父类方法更多的异常,但可以抛出父类方法异常的子异常