15.异常处理

  1. 什么是异常

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

    2. 异常的体系结构

    3. 说明
      根接口是Throwable
      异常(exception):通常发生后可以处理(可保证程序的正常执行)
      运行时异常:系统异常
      自定义异常:根据业务需要自己定义的异常
      可自定义系统异常(继承RuntimeException)
      可自定义普通异常(继承Exception)
      错误(Error):一般指编译时,语法不对产生的,编译都不能通过更不用谈执行了

  2. 常用系统异常有那些
    ArithmeticException 算术异常类,如以零做除数
    ArrayIndexOufOfBoundsException 数组下标越界异常
    NullpointerException 空指针异常
    ClassNotFouundException 不能加载所需的类
    IOException 输入输出异常
    SQLException 操作数据库异常
    FileNotFoundException 文件末找到异常
    llegalArgumentException 非法的参数异常
    1.

  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
posted @ 2018-09-10 01:57  River111  阅读(162)  评论(0编辑  收藏  举报