Java中的异常处理机制

  1.Java中巴各种不同的异常情况定义为异常类,这样可以充分发挥类的扩展性和可重用性;

 

  2.异常的处理流程和正常流程分离,提高代码的可读性;

 

  3.灵活地处理各种异常,如果捕获异常的方法有能力处理异常,则当前方法捕获并且处理它(try...catch),否则由调用该方法的方法对异常进行处理

 

  4.java虚拟机的方法调用栈

    每一个线程都有一个方法调用栈,用于跟踪线程的方法调用过程,每一个方法对应一个栈帧,栈帧中保存方法的信息,包括局部变量,参数和临时操作数。

    在线程执行方法的过程中,如果捕获到异常,JVM会去找捕获并处理该异常的catch代码块,具体过程如下:

     a.看当前方法中是否存在catch代码块,如果存在,则执行该代码块;

     b.否则,从方法调用栈中弹出当前方法的栈帧,JVM的处理流程回溯到当前方法的调用方法,在查看该调用方法有没有处理异常的catch块,如果有,则执行,如果没有,则一级一级地弹出栈帧,直至main()方法;

    c.如果到最后都没有找到处理异常的catch代码块,JVM会按照如下流程进行处理

        (1)调用异常对象的printStackTrace()方法,打印来自方法调用栈的信息;

        (2)如果该线程不是主线程,则终止该线程,其他线程继续正常运行,如果该线程是主线程,则整个应用程序终止;

 

  5.运用Java的异常处理机制

      Java提供两种异常处理机制

      (1)用try...catch语句捕获并且处理异常;

      (2)使用throw抛出异常,异常必须是java.lang.Throwable类的对象或者该类的子类的对象;

      (3)使用throws声明方法抛出异常;

      (4)使用finally语句声明在任何情况下都会执行的代码。

  6.try...catch的用法

     (1)try不能脱离catch或者finally而单独存在;

     (2)try后面可以跟0个或者多个catch,还可以有至多0个或者多个finally

     (3)try后面可以只跟finally代码块

     (4)在try代码块中定义的变量的作用域只能够用于try代码块,在catch代码块和finally代码块中不能够访问该变量;

     (5)当try代码块后面跟若干个catch块时,JVM会一次匹配异常情况,如果抛出的异常类型是catch处理异常类型或者是其子类型,则执行相应的catch代码块,之后的catch块不会再执行;

     (6)如果一个方法可能抛出受检查异常,要么使用try...catch进行捕获和处理,或者使用throws声明抛出异常;

 

  7.java.lang.Throwable是java中的异常类

      提供两个方法

          getMessage()

          printStackTrace()

  8.受检查异常和运行时异常

         运行时异常

           抛出一个异常(throw 一个异常的对象)没有用try...catch捕获并处理,也没有用throws进行声明,这样的错误在编译时并不会检查出来,在运行时才会出现运行时的异常。

         受检查异常

           除了运行时异常,其他异常均是受检查异常,特点是如果throw一个异常对象,如果没有使用try...catch捕获并处理,并且没有使用throws对异常进行声明,则会出现编译错误。

       Java中的运行时异常

          IllegalArgumentException

          ClassCastException

          IndexOutOfBoundException

          NullPointerException

          ArithmeticException

你可能感兴趣的:(Java)