一.多个异常使用捕获又该如何处理呢?
1.多个异常分别处理
// 1.多个异常分别处理 try { int[] arr = {1, 2, 3}; System.out.println(arr[3]); // 数组索引异常 }catch(ArrayIndexOutOfBoundsException e){ e.printStackTrace(); } System.out.println("后续代码1"); try{ List<Integer> list = new ArrayList<>(); // 抽象类不能实例化,多态写法 Collections.addAll(list,1,2,3); // 多添加 System.out.println(list.get(3)); // 列表索引越界异常 }catch(IndexOutOfBoundsException e){ e.printStackTrace(); } System.out.println("后续代码2");
2.多个异常一次捕获,多次处理
try{ int[] arr = {1, 2, 3}; System.out.println(arr[3]); // 数组索引异常 List<Integer> list = new ArrayList<>(); // 抽象类不能实例化,多态写法 Collections.addAll(list,1,2,3); // 多添加 System.out.println(list.get(3)); // 列表索引越界异常 }catch(ArrayIndexOutOfBoundsException e){ // 数组越界 e.printStackTrace(); }catch(IndexOutOfBoundsException e){ // 列表越界 e.printStackTrace(); } System.out.println("后续代码3");
一个try多个catch注意事项:
catch里边定义的异常变量,如果有子父类关系,那么子类的异常变量必须写在上边,否则就会报错。(有运行优先级,从上到下一次赋值给catch中定义的异常变量)
3.多个异常一次捕获一次处理
// 3.多个异常一次捕获一次处理 try{ int[] arr = {1, 2, 3}; System.out.println(arr[3]); // 数组索引异常 List<Integer> list = new ArrayList<>(); // 抽象类不能实例化,多态写法 Collections.addAll(list,1,2,3); // 多添加 System.out.println(list.get(3)); // 列表索引越界异常 }/*catch(ArrayIndexOutOfBoundsException e){ // 数组越界 e.printStackTrace(); }*/catch(IndexOutOfBoundsException e){ // 集合越界,选用父类 e.printStackTrace(); } System.out.println("后续代码4");
实际上运行时异常被抛出可以不处理,即不声明也不捕获,默认会给JVM处理,打印信息,终止程序。
二.finally有return语句
如果finally有return语句,返回的永远是finally中的结果,避免该情况。
public static void main(String[] args) { int a = getA(); System.out.println(a); // 100 } //定义一个方法,返回变量a的值 public static int getA(){ int a = 10; try{ return a; }catch(Exception e){ e.printStackTrace(); }finally{ // 一定会执行的代码 a = 100; return a; } }
三.子父类异常
注意:父类异常是什么样,子类异常就什么样
如果父类抛出多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
public class Fu { public void show01() throws NullPointerException,ClassCastException{} public void show02() throws IndexOutOfBoundsException{} public void show03() throws Exception{} } class Zi extends Fu{ // 子类重写父类方法时,抛出和父类相同的异常 public void show01() throws NullPointerException{} // 子类重写父类方法时,抛出父类异常的子类 public void show02() throws ArrayIndexOutOfBoundsException{} // 子类重写父类方法时,不抛出异常 public void show03() {} }
父类方法没有抛出异常,子类重写父类方法时,也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
public class Fu { public void show04(){} } class Zi extends Fu{ // 父类方法没有抛出异常,子类重写父类方法时,也不可抛出异常。 // public void show04(){} // 此时子类产生该异常,只能捕获处理,不能声明抛出。 public void show04(){ // throw new Exception("子类产生编译期异常!"); // 错误,父类没有声明异常,子类也不能 try{ }catch(Exception e){} } }