【Java SE】异常处理

来源:互联网 发布:模拟软件下载 编辑:程序博客网 时间:2024/05/31 20:52
  • 异常类的继承关系

    • 异常的继承树
      • Object类的直接子类Throwable描述了所有被虚拟机抛出的非正常状况(一般不用Throwable,而是用其子类Error、Exception)
        • Error类:特指应用程序在运行期间发生的严重错误(一般情况下这种错误都是灾难性的,故没必要使用异常处理机制处理)
        • Exception类:
          • 以RuntimeException为代表的一些类,称为非检查性异常:这种异常在编译时不进行检查,到运行时才会显现
          • 以IOException为代表的一些类,称为检查性异常:这种异常必须进行异常处理,否则编译时不能通过
          • 还有其他子类,描述其他类型的异常
    • 异常类型:检查性异常、非检查性异常

  • 异常处理机制

    • 异常的处理过程:抛出异常→捕获异常→处理异常
      • 如果程序中有异常,那么抛出异常这行代码后的所有代码将不再执行
      • Java中处理异常的两种方式:
        1. 自行处理:可能引发异常的语句封入在try块内,而处理异常的相应语句则封入在catch块内
        2. 回避异常:在方法声明中包含throws子句,通知潜在调用者,如果发生了异常,必须由调用者处理
      public static void main(String[] args){    int i=0;    int[] a={1,2,3,4,5};    try{        while(i<6){            System.out.println(a[i]+" ");            i++;        }    }    catch(ArrayIndexOutOfBoundsException e){        System.out.println("ArrayIndexOutOfBoundsException!");        return;    }    catch(RuntimeException e){        System.out.println("RuntimeException!");    }    catch(Exception e){        System.out.println("Exception!");    }    finally{        System.out.println("program is running into finally!");    }}
    • try...catch语句
      • 语法:try{可能发生异常的语句}catch(异常类对象的声明){对异常的处理语句}
      • 若try块当中抛出异常,那try块就会夺取程序的运行权,这个异常后的代码将不再运行,try块会将运行权移交给catch块
      • catch块:用来捕获并处理try块抛出的异常的代码块,catch块不能离开try块单独存在,一个try块可以有多个catch块以捕获不同类型的异常
        • 和特殊异常类相关联的catch()块必须写在和普通异常类相关联的catch()之前
      • try{}和catch(){}之间不可以添加任何代码
    • 异常处理机制主要处理检查性异常而不是非检查性异常和Error
      • 每次try块有异常抛出,系统会试着从上到下往每个catch块中传参,直到遇到一个类型匹配的catch块为止
      • 形参为Exception类型的catch块只能放到最后面,否则所有的异常都被它处理了,其他的catch块就不能分门别类的起作用了
    • finally语句
      • finally语句放在try...catch语句后
      • finally语句中的代码块不管异常是否被捕获总是要执行
      • 通常在finally语句中可以进行资源的清除操作,如,关闭打开文件、删除临时文件
      • 即使try代码块和catch代码块中使用了return语句退出当前方法或使用break跳出某个循环,后面的finally代码块都会执行
      • 当try或catch代码块中执行了System.exit(0)时,finally代码块中的内容不被执行
    • throws关键字
      • 如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理,则可以在程序所在的方法声明后,使用throws关键字抛出异常
        class ThrowsDemo{    public void proc() throws IOException{        System.out.println("inside proc");    }}
      • throws关键字位于方法参数列表的后面,可以接多个异常,中间用逗号分隔
      • throws关键字抛出的异常,由调用该方法的方法处理
      • 覆盖方法抛出异常时,可以抛出与被覆盖方法相同的异常,或者被覆盖方法异常的子类异常
    • throw关键字
      • 程序可以用throw语句引发明确的异常
      • throw语句用在方法体内,表示抛出异常,由方法体内的语句处理
      • throw语句不能单独使用,要么和try...catch...一起使用,要么和throws一起使用
      • throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象
  • 方法调用的堆栈

    • 后进先出:方法A调用方法B的时候,只有方法B先完成后,方法A才完成
    • 先执行的方法总是后完成,后执行的方法先完成,类似于数据结构中的堆栈,故称为方法调用堆栈
  • 自定义异常

    • 如果Java提供的异常类型不能满足程序设计的需要,我们可以定义自己的异常类型
    • 用户自定义的异常类应为Exception类(或者Exception类的子类)的子类
0 0
原创粉丝点击