异常的注意事项

一.多个异常使用捕获又该如何处理呢?

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){}
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值