您的位置:首页 > 其它

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

2018-03-29 23:48 357 查看
* 如果程序出现了问题,我们没有做任何处理,最终JVM会做出默认的处理。
* 把异常的名称原因出现的位置等信息输出在控制台。同时会结束程序。
*
* 但是呢,其余没有问题的程序就不能继续执行了。
* 所以感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?

* 异常的处理方案
*    A:try...catch...finally
*      自己编写处理的代码,后面没有问题的程序可以继续执行。
*    B:throws 抛出
*      把自己处理不了的异常,在方法上声明,告诉调用者,这里有问题。

  示例代码如下:

package cn.itcast_02;

/*
* 如果程序出现了问题,我们没有做任何处理,最终JVM会做出默认的处理。
* 把异常的名称、原因及出现的位置等信息输出在控制台。同时会结束程序。
*
* 但是呢,其余没有问题的程序就不能继续执行了。
* 所以感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?
*
  * 异常的处理方案
*         A:try...catch...finally
*             自己编写处理的代码,后面没有问题的程序可以继续执行。
*         B:throws 抛出
*             把自己处理不了的异常,在方法上声明,告诉调用者,这里有问题。
  *
* try...catch...finally的处理格式:
*         try {
*             可能出现问题的代码;
*         } catch (异常类名 变量名) {
*             针对问题的处理;
*         } finally {
*             释放资源;
*         }
*
  * 变形格式:
*         try {
*             可能出现问题的代码;
*         } catch(异常类名 变量名) {
*             针对问题的处理;
*         }
  *
* 注意:
*         A:try里面的代码越少越好。
*         B:catch里面必须有内容,哪怕是给出一个简单的提示。否则就隐藏了异常。
*/
public class ExceptionDemo {
public static void main(String[] args) {
// 第一阶段
int a = 10;
// int b = 2;
int b = 0;

try {
System.out.println(a / b);
} catch (ArithmeticException e) { // ArithmeticException 算术异常
System.out.println("除数不能为0");
}

// 第二阶段
System.out.println("over");
}
}


两/多个异常的处理

  示例代码如下:

package cn.itcast_02;

/*
  * A:一个异常的处理
  *         try...catch...finally的处理格式:
*             try {
*                 可能出现问题的代码;
*             } catch (异常类名 变量名) {
*                 针对问题的处理;
*             } finally {
*                 释放资源;
*             }
*         变形格式:
*             try {
*                 可能出现问题的代码;
*             } catch(异常类名 变量名) {
*                 针对问题的处理;
*             }
*
  * B:两/多个异常的处理
  *         a:每一个异常写一个try...catch
*         b:写一个try,多个catch
*             try {
*                 可能出现问题1的代码;
*                 可能出现问题2的代码;
*                 可能出现问题3的代码;
*                 ...
*             } catch (异常类名1 变量名) {
*                 针对问题1的处理;
*             } catch (异常类名2 变量名) {
*                 针对问题2的处理;
*             } catch (异常类名3 变量名) {
*                 针对问题3的处理;
*             }
*             ...
*
 37  *             注意事项:
38  *                 1:能明确具体的异常尽量明确,最好不要用大的异常(父亲)来处理。
39  *                 2:平级关系的具体的异常谁前谁后无所谓,如果出现了子父关系得异常,父异常必须在后面。
  *
 41  * 注意:
42  *         一旦try里面出了问题,就会在这里把问题给抛出去,然后和catch里面的问题进行匹配,
43  *         一旦有匹配的,就执行catch里面的处理,然后就结束了try...catch语句,继续执行后面的语句。
  */
public class ExceptionDemo2 {
public static void main(String[] args) {
// method1();

// method2();

// method3();

method4();
}

// 多个异常的处理
public static void method4() {
int a = 10;
int b = 0;
int[] arr = { 1, 2, 3 };

// 爷爷在最后可以
try {
System.out.println(a / b);
System.out.println(arr[3]);
System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?");
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你访问了不该访问的索引");
} catch (Exception e) { // 不知道你出现的异常到底是哪一个具体的异常,反正你是异常,那么就用异常的父类(你的父亲)来接收。即不管我针对哪一个具体的异常都可以处理。
System.out.println("出问题了");
}

/*
// 爷爷在前面是不可以的
try {
System.out.println(a / b);
System.out.println(arr[3]);
System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?");
} catch (Exception e) {
System.out.println("出问题了");
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你访问了不该的访问的索引");
}
*/

System.out.println("over");
}

// 两个异常的处理:写一个try,多个catch
public static void method3() {
int a = 10;
int b = 0;
int[] arr = { 1, 2, 3 };

try {
System.out.println(arr[3]);
System.out.println(a / b);
// System.out.println(arr[3]);
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你访问了不该的访问的索引");
}

System.out.println("over");
}

// 两个异常的处理:每一个异常写一个try...catch
public static void method2() {
int a = 10;
int b = 0;
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
}

int[] arr = { 1, 2, 3 };
try {
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你访问了不该的访问的索引");
}

System.out.println("over");
}

// 一个异常的处理
public static void method1() {
// 第一阶段
int a = 10;
// int b = 2;
int b = 0;

try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
}

// 第二阶段
System.out.println("over");
}
}


JDK7出现了一个新的异常处理方案及注意事项

  示例代码如下:

package cn.itcast_02;

/*
  * JDK7出现了一个新的异常处理方案及注意事项:
*         try {
*             可能出现问题1的代码;
*             可能出现问题2的代码;
*             ...
*         } catch (异常类名1 | 异常类名2 | ...  变量名 ) {
*             针对问题的处理;
*         }
  *
13  *         注意事项:这个方法虽然简洁,但是也不够好。
14  *             A:对多个异常的处理方式是一致的。(但是实际开发中,好多时候可能就是针对同类型的问题,给出同一个处理方式,是符合我们的开发要求的)
15  *             B:多个异常间必须是平级关系。
  */
public class ExceptionDemo3 {
public static void main(String[] args) {
method();
}

public static void method() {
int a = 10;
int b = 0;
int[] arr = { 1, 2, 3 };

/*
// JDK7以前的异常处理方案
try {
System.out.println(a / b);
System.out.println(arr[3]);
System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?");
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你访问了不该的访问的索引");
} catch (Exception e) {
System.out.println("出问题了");
}
*/

// JDK7出现了一个新的异常处理方案
try {
System.out.println(a / b);
System.out.println(arr[3]);
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println("出问题了");
}

System.out.println("over");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐