* 如果程序出现了问题,我们没有做任何处理,最终JVM会做出默认的处理。
* 把异常的名称、原因及出现的位置等信息输出在控制台。同时会结束程序。
*
* 但是呢,其余没有问题的程序就不能继续执行了。
* 所以感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?
* 异常的处理方案
* A:try...catch...finally
* 自己编写处理的代码,后面没有问题的程序可以继续执行。
* B:throws 抛出
* 把自己处理不了的异常,在方法上声明,告诉调用者,这里有问题。
示例代码如下:
1 package cn.itcast_02; 2 3 /* 4 * 如果程序出现了问题,我们没有做任何处理,最终JVM会做出默认的处理。 5 * 把异常的名称、原因及出现的位置等信息输出在控制台。同时会结束程序。 6 * 7 * 但是呢,其余没有问题的程序就不能继续执行了。 8 * 所以感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢? 9 * 10 * 异常的处理方案 11 * A:try...catch...finally 12 * 自己编写处理的代码,后面没有问题的程序可以继续执行。 13 * B:throws 抛出 14 * 把自己处理不了的异常,在方法上声明,告诉调用者,这里有问题。 15 * 16 * try...catch...finally的处理格式: 17 * try { 18 * 可能出现问题的代码; 19 * } catch (异常类名 变量名) { 20 * 针对问题的处理; 21 * } finally { 22 * 释放资源; 23 * } 24 * 25 * 变形格式: 26 * try { 27 * 可能出现问题的代码; 28 * } catch(异常类名 变量名) { 29 * 针对问题的处理; 30 * } 31 * 32 * 注意: 33 * A:try里面的代码越少越好。 34 * B:catch里面必须有内容,哪怕是给出一个简单的提示。否则就隐藏了异常。 35 */ 36 public class ExceptionDemo { 37 public static void main(String[] args) { 38 // 第一阶段 39 int a = 10; 40 // int b = 2; 41 int b = 0; 42 43 try { 44 System.out.println(a / b); 45 } catch (ArithmeticException e) { // ArithmeticException 算术异常 46 System.out.println("除数不能为0"); 47 } 48 49 // 第二阶段 50 System.out.println("over"); 51 } 52 }
两/多个异常的处理
示例代码如下:
1 package cn.itcast_02; 2 3 /* 4 * A:一个异常的处理 5 * try...catch...finally的处理格式: 6 * try { 7 * 可能出现问题的代码; 8 * } catch (异常类名 变量名) { 9 * 针对问题的处理; 10 * } finally { 11 * 释放资源; 12 * } 13 * 变形格式: 14 * try { 15 * 可能出现问题的代码; 16 * } catch(异常类名 变量名) { 17 * 针对问题的处理; 18 * } 19 * 20 * B:两/多个异常的处理 21 * a:每一个异常写一个try...catch 22 * b:写一个try,多个catch 23 * try { 24 * 可能出现问题1的代码; 25 * 可能出现问题2的代码; 26 * 可能出现问题3的代码; 27 * ... 28 * } catch (异常类名1 变量名) { 29 * 针对问题1的处理; 30 * } catch (异常类名2 变量名) { 31 * 针对问题2的处理; 32 * } catch (异常类名3 变量名) { 33 * 针对问题3的处理; 34 * } 35 * ... 36 * 37 * 注意事项: 38 * 1:能明确具体的异常尽量明确,最好不要用大的异常(父亲)来处理。 39 * 2:平级关系的具体的异常谁前谁后无所谓,如果出现了子父关系得异常,父异常必须在后面。 40 * 41 * 注意: 42 * 一旦try里面出了问题,就会在这里把问题给抛出去,然后和catch里面的问题进行匹配, 43 * 一旦有匹配的,就执行catch里面的处理,然后就结束了try...catch语句,继续执行后面的语句。 44 */ 45 public class ExceptionDemo2 { 46 public static void main(String[] args) { 47 // method1(); 48 49 // method2(); 50 51 // method3(); 52 53 method4(); 54 } 55 56 // 多个异常的处理 57 public static void method4() { 58 int a = 10; 59 int b = 0; 60 int[] arr = { 1, 2, 3 }; 61 62 // 爷爷在最后可以 63 try { 64 System.out.println(a / b); 65 System.out.println(arr[3]); 66 System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?"); 67 } catch (ArithmeticException e) { 68 System.out.println("除数不能为0"); 69 } catch (ArrayIndexOutOfBoundsException e) { 70 System.out.println("你访问了不该访问的索引"); 71 } catch (Exception e) { // 不知道你出现的异常到底是哪一个具体的异常,反正你是异常,那么就用异常的父类(你的父亲)来接收。即不管我针对哪一个具体的异常都可以处理。 72 System.out.println("出问题了"); 73 } 74 75 /* 76 // 爷爷在前面是不可以的 77 try { 78 System.out.println(a / b); 79 System.out.println(arr[3]); 80 System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?"); 81 } catch (Exception e) { 82 System.out.println("出问题了"); 83 } catch (ArithmeticException e) { 84 System.out.println("除数不能为0"); 85 } catch (ArrayIndexOutOfBoundsException e) { 86 System.out.println("你访问了不该的访问的索引"); 87 } 88 */ 89 90 System.out.println("over"); 91 } 92 93 // 两个异常的处理:写一个try,多个catch 94 public static void method3() { 95 int a = 10; 96 int b = 0; 97 int[] arr = { 1, 2, 3 }; 98 99 try { 100 System.out.println(arr[3]); 101 System.out.println(a / b); 102 // System.out.println(arr[3]); 103 } catch (ArithmeticException e) { 104 System.out.println("除数不能为0"); 105 } catch (ArrayIndexOutOfBoundsException e) { 106 System.out.println("你访问了不该的访问的索引"); 107 } 108 109 System.out.println("over"); 110 } 111 112 // 两个异常的处理:每一个异常写一个try...catch 113 public static void method2() { 114 int a = 10; 115 int b = 0; 116 try { 117 System.out.println(a / b); 118 } catch (ArithmeticException e) { 119 System.out.println("除数不能为0"); 120 } 121 122 int[] arr = { 1, 2, 3 }; 123 try { 124 System.out.println(arr[3]); 125 } catch (ArrayIndexOutOfBoundsException e) { 126 System.out.println("你访问了不该的访问的索引"); 127 } 128 129 System.out.println("over"); 130 } 131 132 // 一个异常的处理 133 public static void method1() { 134 // 第一阶段 135 int a = 10; 136 // int b = 2; 137 int b = 0; 138 139 try { 140 System.out.println(a / b); 141 } catch (ArithmeticException e) { 142 System.out.println("除数不能为0"); 143 } 144 145 // 第二阶段 146 System.out.println("over"); 147 } 148 }
JDK7出现了一个新的异常处理方案及注意事项
示例代码如下:
1 package cn.itcast_02; 2 3 /* 4 * JDK7出现了一个新的异常处理方案及注意事项: 5 * try { 6 * 可能出现问题1的代码; 7 * 可能出现问题2的代码; 8 * ... 9 * } catch (异常类名1 | 异常类名2 | ... 变量名 ) { 10 * 针对问题的处理; 11 * } 12 * 13 * 注意事项:这个方法虽然简洁,但是也不够好。 14 * A:对多个异常的处理方式是一致的。(但是实际开发中,好多时候可能就是针对同类型的问题,给出同一个处理方式,是符合我们的开发要求的) 15 * B:多个异常间必须是平级关系。 16 */ 17 public class ExceptionDemo3 { 18 public static void main(String[] args) { 19 method(); 20 } 21 22 public static void method() { 23 int a = 10; 24 int b = 0; 25 int[] arr = { 1, 2, 3 }; 26 27 /* 28 // JDK7以前的异常处理方案 29 try { 30 System.out.println(a / b); 31 System.out.println(arr[3]); 32 System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?"); 33 } catch (ArithmeticException e) { 34 System.out.println("除数不能为0"); 35 } catch (ArrayIndexOutOfBoundsException e) { 36 System.out.println("你访问了不该的访问的索引"); 37 } catch (Exception e) { 38 System.out.println("出问题了"); 39 } 40 */ 41 42 // JDK7出现了一个新的异常处理方案 43 try { 44 System.out.println(a / b); 45 System.out.println(arr[3]); 46 } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { 47 System.out.println("出问题了"); 48 } 49 50 System.out.println("over"); 51 } 52 53 }