15.异常处理

  1. 什么是异常
    1. 程序执行产生了非预期的结果(突然下降冰雹,天气预报说是晴天),此时程序会终止运行
    2. 异常的体系结构

    3. 说明
      根接口是Throwable
      异常(exception):通常发生后可以处理(可保证程序的正常执行)
      运行时异常:系统异常
      自定义异常:根据业务需要自己定义的异常
      可自定义系统异常(继承RuntimeException)
      可自定义普通异常(继承Exception)
      错误(Error):一般指编译时,语法不对产生的,编译都不能通过更不用谈执行了
  2. 常用系统异常有那些
    ArithmeticException 算术异常类,如以零做除数
    ArrayIndexOufOfBoundsException 数组下标越界异常
    NullpointerException 空指针异常
    ClassNotFouundException 不能加载所需的类
    IOException 输入输出异常
    SQLException 操作数据库异常
    FileNotFoundException 文件末找到异常
    llegalArgumentException 非法的参数异常
  3. 如何自定义异常类
    1. 可自定义系统异常(继承RuntimeException)

    2. 可自定义普通异常(继承Exception)

    3. 它们的区别
      前者处理异常的方式只有:抛出,抓住
      后者多一种方式:JVM处理(建议使用后者)
  4. 什么是异常处理
    1. 对可能发生的异常行为进行处理
  5. 异常处理的作用
    1. 完善代码功能(有漏洞就会有异常),保证程序的正常运行
  6. 如何使用异常处理(默认是JVM处理)
    1. 抛出异常,让调用者来处理
      在方法名后抛出
      关键字:throws
      语法
      方法的定义 方法名 throws 异常类名1,…,异常类名n{

           }
        说明
            调用此方法时需要解决异常
                继续抛出
      
                使用try-catch语句块
      
                如果是系统异常,什么都不做交给JVM处理
      
            我们需要抛出的一般是自定义异常

      在方法体内抛出
      关键字:throw
      语法
      throw 异常对象
      说明
      如果抛出异常对象是自定义异常就需要解决异常
      继续抛出
      使用try-catch语句块
      图解

            如果抛出的异常对象是系统异常,可什么都不做交给JVM处理
      
            通常是:new 异常类型(变量数据+"异常信息");这样的形式构造异常对象
            通用系统异常类型就用,节省工作量
                如:IllegalArgumentException
    2. 抓住异常,直接处理掉异常
      执行流程
      try是必须的:程序执行try中语句块时,一旦发生异常,try中剩余的代码不会执行
      如果有catch(finally)至少有一个
      先判断发生的异常对象是否这catch捕获的异常对象或是其子类
      如果是就进行catch语句块
      如果不是就跳转到下个catch语句块进行相同的操作
      如果有finally(catch)至少有一个
      无论如何总会执行
      处理异常的编码思路
      打印异常信息,方便弄清问题所在
      异常对象.printStackTrace()打印堆栈信息
      异常完整类名:异常信息
      发生异常的起始位置
      如果只想获取异常信息:异常对象.getMessage()
      输出提示,并根据需求处理此异常
      编码方式
      trach-catch:抓住异常并处理
      语法
      try{
      可能发生异常的代码段;
      }catch(异常类型变量){
      异常处理操作;
      }…
      catch(异常类型变量){
      异常处理操作;
      }
      说明
      可以有多个catch语句块

                多个catch语句块时,根据异常对象的层级关系从小到大写(这样代码才合理)
      
                非层级关系的异常对象可合并一起写,减少catch语句块个数
      
                选择需要异常处理的代码块,按alt+shift+z可快速构建try-catch块
      
        trach-catch-finally:抓住异常并处理,最后释放相应的资源
            语法
               try{
      
               }catch(异常类型 变量){
      
               }
               …
               catch(异常类型 变量){
      
               }finally{
                   释放资源的代码;
               }
            说明
                不可有多个finally
                从上到下,都要执行的代码放在finally块中(如:关闭流)
      
                除非你手动退出JVM,否则在JVM终止程序前总会执行finally语句块的(一般不会这样做)
      
                虽然try可只与finally组合使用,没意义(因为没异常处理呀)
    3. 让JVM处理异常
      终止程序执行
      在控制台输出堆栈信息
      异常完整类名:异常信息
      发生异常的起始位置
      图解

  7. 说明
    1. 程序中有异常必须处理,不处理就是错误(编译不通过)
    2. 处理异常总共3种方式,自行选择(如果是自定义普通异常只有2种选择)
    3. 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类(解释如下)
      1. 子类不能抛出父类没有的异常
      2. 如果被重写的方法没有异常抛出
        那么子类的方法绝对不可以抛出异常
        如果子类方法内有异常发生,那么子类只能try,不能throws
    4. 如何选择处理异常的方式
      1. 如果想让程序继续运行选择抓住异常
      2. 如果只是想看异常信息选择抛出异常
        首选JVM处理方式
        次选抛出异常
    5. final,finally,finalize的区别
      1. final:修饰类或类成员
      2. finally:异常处理的语句块
      3. finalize:Object定义的垃圾回收机制的方法
    6. finally与return混合使用时,return如何返回
      1. 如下代码输出结果是?
        1)
        2) 结果是:5
        3) 分析
        1) return的作用是:结束方法调用或返回值
        2) 没有异常,程序会走try,会走finally
        1. 执行try:a变成了2,此时return a只起到返回值的作用(把结果放进函数栈),没结束方法
        2. 执行finally:a变成了5,此时return a既返回值,又结束方法调用,所以最后结果是5
        3) 扩展
        1. 如果注释finally后面return语句,输出结果就是2
        2. 如果在a+=1后面抛出异常,throw new Exception();需要删除 return a;语句输出结果就是7

猜你喜欢

转载自www.cnblogs.com/River111/p/9616590.html