Java异常处理(二)
异常也是多态的
- 当处理多重异常时,为每个需要单独处理的的异常编写不同的catch块
public class takeRisk {
public void takeRisk() {
int[] array = new int[4];
System.out.println(array[5]);//制造出第一处异常(非法索引异常)
int[] array1 = new int[2];
array1 = null;
System.out.println(array1[1]);//制作出第二处异常(空指针异常)
}
}
public class ExceptionDemo {
public static void main(String[] args) {
takeRisk q = new takeRisk();
try {
q.takeRisk();
} catch (ArrayIndexOutOfBoundsException ex) {
ex.printStackTrace();
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
}
运行结果是
java.lang.ArrayIndexOutOfBoundsException: 5
at takeRisk.takeRisk(takeRisk.java:5)
at ExceptionDemo.main(ExceptionDemo.java:8)
列出了异常信息。
- 也可以以所抛出异常的父类来catch异常
try {
q.takeRisk();
} catch (Exception ex) {
ex.printStackTrace();
}
这样做会捕捉到所有的异常,但是你会搞不清楚哪里出错
- 当有多个catch块时,要从小排到大
如果你从上往下沿着继承层次走,异常类就会越来越具体,catch的范围也就会越来越小,这就是多态的体现。
不能把父类异常放在子类异常之上
java虚拟机只会从头开始找第一个符合范围的catch块,如果第一个catch块就是catch(Exception ex),则编译器会认为其余的catch都是没有用处的。
当你不想处理异常时,使用duck
什么是duck,相信大家第一次看到这个东西都有点懵,说白了就是在方法处声明一下该方法可能会抛出的异常。
此时你无需来管那烦人的try/catch
public class ExceptionDemo {
public static void main(String[] args) throws ArrayIndexOutOfBoundsException {
takeRisk q = new takeRisk();
q.takeRisk();
}
}
这时有声明会抛出异常,但没有try/catch,所以就会duck掉异常留给调用方。
但我一直认为duck掉main()是不仗义的行为,这样做,异常并没有得到处理,只是能够通过编译器的检查。