java異常的嵌套和級聯

1、分開捕獲或者嵌套使用spa

咱們先看看下面這段代碼:code

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;

        //一、這裏可能會拋出異常
        System.out.print("num1=");
        num1 = scanner.nextInt();
        System.out.print("num2=");
        num2 = scanner.nextInt();

        Cal cal = new Cal();
        //二、這裏也可能拋出異常
        s = cal.div(num1, num2);

        System.out.println(s);
    }
}

 

在這段代碼中有可能拋出異常的有兩個地方,那麼咱們應該如何處理呢。blog

一、固然咱們能夠分開捕獲。以下面的代碼:it

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 {
            
            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();
                //二、這裏也可能拋出異常
        try {
            s = cal.div(num1, num2);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(s);
    }
}

 

二、咱們還能夠在try裏面嵌套的使用try語句。以下面代碼所示:io

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 {
            //一、這裏可能會拋出異常
            System.out.print("num1=");
            num1 = scanner.nextInt();
            System.out.print("num2=");
            num2 = scanner.nextInt();
            
            try {
                Cal cal = new Cal();
                //二、這裏也可能拋出異常
                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);
    }
}

 

2、使用級聯捕獲異常class

上面介紹的這兩種方法都不是好辦法,覺得過多的使用try捕獲異常會影響程序的效率。因此咱們推薦使用的是級聯捕獲異常。格式以下效率

try{

…...

}catch(ArrayIndexOutOfBoundsException e) {

……

} catch(ArithmeticException e) {

……

} catch(Exception e) {

……

}

 

注意:使用多重 catch 語句時,異常子類必定要位於異常父類以前。exception

因此如下這種方式是錯誤的。循環

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 {
            //一、這裏可能會拋出異常
            System.out.print("num1=");
            num1 = scanner.nextInt();
            System.out.print("num2=");
            num2 = scanner.nextInt();

            Cal cal = new Cal();
            //二、這裏也可能拋出異常
            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
        }
    }
相關文章
相關標籤/搜索