异常的继承结构
ArithmeticException: |
NumberFormatException: |
java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.ArithmeticException |
java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.IllegalArgumentException java.lang.NumberFormatException |
发现现在给出的两个异常都是Throwable的子类,通过文档可以发现,Throwable下有两个直接子类:
Error和Exception的区别:
Error:指的是JVM错误,此时的程序还没有运行,所以此错误无法处理;
Exception:指的是程序运行之中出现的异常,此时程序已经运行了,用户可以处理。
异常的处理流程
try {
result= x / y ; // 除法计算
}catch (Exception e) {//捕获异常
e.printStackTrace() ;//打印异常的完整信息
}finally {
System.out.println("***除法计算结束 ***") ;// 不管是否出现异常都要执行
}
1、 当程序运行过程之中产生了异常之后,会根据产生的异常形式自动的生成一个与之相关的异常类对象;
2、 如果此时程序之中没有编写任何的异常处理语句,那么就将采用默认的方式进行异常的处理,即:将所有的异常交给JVM进行处理,由JVM输出异常的信息,而后让程序直接中断执行;
3、 如果此时程序中存在了异常处理,则会由try语句来捕获指定的异常类对象,而后try语句之后的代码不再执行;
4、 此时的try语句会将此异常对象按照方法参数传递那样(把catch想象一个方法名称,里面的异常类型为参数),与每一个catch中的捕获异常类型进行匹配,如果有匹配的catch则使用此catch中的语句进行异常处理,而如果此时异常不匹配,则会继续向下进行匹配,如果没有任何一个catch与之匹配,这个时候如果存在finall,则继续执行finally;
5、 在finally之中,如果之前已经成功处理了异常,则此处向下继续执行程序,如果之前没有处理异常,则执行完finally程序之后,将把程序交给JVM进行异常处理,最终导致中断执行;
既然此处依然属于一种对象的传递,那么按照之前所学习的面向对象的概念来讲,所有的子类对象都可以统一的向父类转换,那么在异常处理之中,最大的父类是Exception,那么就表示Exception可以接收所有的子类实例化对象。
try {
int x =Integer.parseInt(args[0]) ;
int y = Integer.parseInt(args[1]);
int result = x /y ; // 保留除法计算结果
System.out.println("2、除法计算:" + result) ;
} catch (Exceptione) {
e.printStackTrace();
}
只要是存在了Exception那么所有的异常都可以全部进行处理。如果在程序之中对于异常处理要求不严格的话,例如,上面的代码是完全可以胜任的,如果现在异常处理要求严格,即:不同的异常产生之后要求以不同的方式进行处理,那么就必须编写多个catch语句了。
try {
int x =Integer.parseInt(args[0]) ;
int y =Integer.parseInt(args[1]) ;
int result = x /y ; // 保留除法计算结果
System.out.println("2、除法计算:" + result) ;
} catch (Exception e) {
e.printStackTrace();
} catch (ArithmeticException e) {
e.printStackTrace();
} catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
throws关键字
所谓的throws关键字,指的是在一个方法声明时定义的,表示此方法不处理异常,而交给方法的调用处进行处理。
class MyMath {
public static int div(int x, int y) throws Exception{//抛给调用处处理,此处无需处理
return x / y ;
}
}
public classTestDemo {
public static void main(Stringargs[]) {
try { //谁调用,谁处理
System.out.println(MyMath.div(10,0));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Exception和RuntimeException的区别
RuntimeException是Exception的子类,Exception异常必须进行处理,而RuntimeException的异常由用户选择进行处理;
常见的RuntimeException:NumberFormatException、ArithmeticException、ClassCastException、NullPointerException。
在Java之中,对于所有的RuntimeException的异常都表示用户可以选择性处理,并非强制性的要求处理。而如果在用户不处理的时候,一旦出现异常会交给JVM默认处理,同时程序中断执行。