异常处理

异常的继承结构

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默认处理,同时程序中断执行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值