Java异常处理(二)

时间:2022-11-26 00:43:15

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()是不仗义的行为,这样做,异常并没有得到处理,只是能够通过编译器的检查。