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