感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?

简介: * 如果程序出现了问题,我们没有做任何处理,最终JVM会做出默认的处理。 * 把异常的名称、原因及出现的位置等信息输出在控制台。同时会结束程序。 * * 但是呢,其余没有问题的程序就不能继续执行了。

* 如果程序出现了问题,我们没有做任何处理,最终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 }

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
9天前
|
存储 缓存 算法
深入浅出JVM(二)之运行时数据区和内存溢出异常
深入浅出JVM(二)之运行时数据区和内存溢出异常
|
10天前
|
存储 算法 Java
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
40 0
|
6月前
|
Java
强制要求JVM始终抛出含堆栈的异常(-XX:-OmitStackTraceInFastThrow)
强制要求JVM始终抛出含堆栈的异常(-XX:-OmitStackTraceInFastThrow)
66 0
|
7月前
|
监控 Java
jvm异常排查
jvm异常排查
29 0
|
7月前
|
存储 缓存 Java
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
176 0
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
|
7月前
|
Java
【Java异常】ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit erro
【Java异常】ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit erro
105 0
|
11月前
|
Java Linux 测试技术
《深入理解Java虚拟机》读书笔记(三)--堆栈异常代码示例
《深入理解Java虚拟机》读书笔记(三)--堆栈异常代码示例
93 0
|
IDE Java 开发工具
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
83 0
|
存储 算法 Java
JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】
JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】
45 0
|
Java
编写一个程序,它能导致JVM抛出一个OutOfMemoryError,然后捕获和处理这个异常
编写一个程序,它能导致JVM抛出一个OutOfMemoryError,然后捕获和处理这个异常
178 0