1. 程式人生 > >29、異常的巢狀和級聯

29、異常的巢狀和級聯

學習目標:

1、瞭解異常的巢狀的語法和作用

2、瞭解級聯捕獲異常的意義和語法

 

學習過程:

這節我們需要探討的問題是,如果我們需要try嘗試捕獲的異常不止一個,那麼我們需要如何處理呢?

一、分開捕獲或者巢狀使用

我們先看看下面這段程式碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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、當然我們可以分開捕獲。如下面的程式碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

  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語句。如下面程式碼所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

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

  ……

}

好,那麼我們可以修改上面的程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

 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語句放到迴圈的外面,例如我們並不推薦你這樣寫程式碼:

1

2

3

4

5

6

7

8

9

10

11

12

public static void main(String[] args) {

        int[] arr = { 1234 };

        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

            }

        }

    }

你可以修改成為這樣:

1

2

3

4

5

6

7

8

9

10

11

   public static void main(String[] args) {

        int[] arr = { 1234 };

        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

        }

    }