java异常的嵌套和级联

一、分开捕获或者嵌套使用

我们先看看下面这段代码:

复制代码
public class Cal {

    public int div(int a, int b) {
        int result = a / b;
        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int s = 0;

        int num1 = 0;
        int num2 = 0;

        //1、这里可能会抛出异常
        System.out.print("num1=");
        num1 = scanner.nextInt();
        System.out.print("num2=");
        num2 = scanner.nextInt();

        Cal cal = new Cal();
        //2、这里也可能抛出异常
        s = cal.div(num1, num2);

        System.out.println(s);
    }
}
复制代码

 

在这段代码中有可能抛出异常的有两个地方,那么我们应该如何处理呢。

1、当然我们可以分开捕获。如下面的代码:

复制代码
public class Cal {

    public int div(int a, int b) {
        int result = a / b;
        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int s = 0;

        int num1 = 0;
        int num2 = 0;
              //1、这里可能会抛出异常
        try {
            
            System.out.print("num1=");
            num1 = scanner.nextInt();
            System.out.print("num2=");
            num2 = scanner.nextInt();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Cal cal = new Cal();
                //2、这里也可能抛出异常
        try {
            s = cal.div(num1, num2);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(s);
    }
}
复制代码

 

2、我们还可以在try里面嵌套的使用try语句。如下面代码所示:

复制代码
public class Cal {

    public int div(int a, int b) {
        int result = a / b;
        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int s = 0;

        int num1 = 0;
        int num2 = 0;

        try {
            //1、这里可能会抛出异常
            System.out.print("num1=");
            num1 = scanner.nextInt();
            System.out.print("num2=");
            num2 = scanner.nextInt();
            
            try {
                Cal cal = new Cal();
                //2、这里也可能抛出异常
                s = cal.div(num1, num2);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        

        System.out.println(s);
    }
}
复制代码

 

二、使用级联捕获异常

上面介绍的这两种方法都不是好办法,以为过多的使用try捕获异常会影响程序的效率。所以我们推荐使用的是级联捕获异常。格式如下

复制代码
try{

…...

}catch(ArrayIndexOutOfBoundsException e) {

……

} catch(ArithmeticException e) {

……

} catch(Exception e) {

……

}
复制代码

 

注意:使用多重 catch 语句时,异常子类一定要位于异常父类之前。

所以以下这种方式是错误的。

复制代码
try{

…...

} catch(Exception e) {

……

} catch(ArrayIndexOutOfBoundsException e) {

……

}
复制代码

 

好,那么我们可以修改上面的代码如下:

复制代码
public class Cal {
    public int div(int a, int b) {
        int result = a / b;
        return result;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int s = 0;

        int num1 = 0;
        int num2 = 0;
        try {
            //1、这里可能会抛出异常
            System.out.print("num1=");
            num1 = scanner.nextInt();
            System.out.print("num2=");
            num2 = scanner.nextInt();

            Cal cal = new Cal();
            //2、这里也可能抛出异常
            s = cal.div(num1, num2);
        } catch (ArithmeticException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (InputMismatchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(s);
    }
}
复制代码

 

由于多次的使用try或影响效率。所以我们如果碰到循环的时候,应该把try语句放到循环的外面,例如我们并不推荐你这样写代码:

复制代码
public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4 };
        Cal cal = new Cal();

        for (int i = 0; i < arr.length; i++) {
            try {
                int s = cal.div(arr[i], 2);
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
复制代码

 

你可以修改成为这样:

复制代码
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4 };
        Cal cal = new Cal();
        try {
            for (int i = 0; i < arr.length; i++) {
                int s = cal.div(arr[i], 2);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
复制代码

 

posted @   韦邦杠  阅读(1557)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示