Java中异常的精细讲解

(注:本篇文章全面的介绍了Java中的异常问题;欢迎大家学习讨论和批评指正)

概念

程序执行过程中不正常的情况

分类

  1. Throwable: 总父类,表示不正常的情况
  2. Error: 错误
    • 无法解决也无法提前避免的问题
    • 通常由硬件设备或内存等问题导致
  3. Exception:异常
    • 可以解决或提前避免的问题
    • 通常由代码导致
    • 分类:
      • RuntimeException:运行时异常,也称为未检查异常、未检异常等
        • 编译不报错,运行报错
        • 可以处理也可以不处理
        • java.lang.ArrayIndexOutOfBoundsException:数组下标越界
        • java.lang.StringIndexOutOfBoundsException:字符串下标越界异常
        • java.lang.IndexOutOfBoundsException:下标越界异常
        • java.lang.NullPointerException:空指针异常
        • java.lang.ClassCastException:类型转换异常
        • java.lang.NumberFormatException:数据类型转换异常
        • java.lang.Arithm eticException:数学运算异常
        • 都来自于java.lang包
      • 非RuntimeException: 非运行时异常,也称为已检查异常、已检异常等
        • 编译就会报错
        • 必须处理
        • 只要不是运行时异常,就一定是非运行时异常

异常的产生

  1. 自动产生: 当运行到有问题的代码时会自动产生异常,程序终止

  2. 手动产生:

    throw 异常对象;
    
    • 位置:方法内部
    • 作用:当程序执行到该语句,则会抛出一个异常对象,使程序强制终止
    • 使用: 同一直属范围内,下方不可存在其他有效语句
      • 无法执行

程序终止执行:

  1. 代码正常运行结束
  2. 执行到异常
  3. 执行到return;

异常的处理

  1. 上抛异常: 消极处理

    访问修饰符 返回值类型 方法名(形参列表)throws 异常类名1,异常类型2,..{
        
    }
    
    • 作用: 将当前方法的内部异常向上抛至调用者,当前方法无法处理该异常. 此时异常并不会被根治,如果异常最终上抛至虚拟机,则仍然会导致程序终止
    • 使用:
      1. 上抛父类异常也可以处理内部的子类异常
      2. 调用者需要处理解决的异常类型由throws上抛的类型决定

    throw和throws的区别:

    1. 位置:throw写在方法内部,throws写在方法声明处
    2. 作用:throw是抛出制造异常,throws是上抛解决异常
  2. 捕捉并解决异常:积极处理

    try{
        //有可能出现异常的代码
    }catch(有可能匹配的异常类名 引用名){
       // 对应的处理方案
    }
    
    • 特点:可以根治异常问题,如果异常正常匹配成功,则程序会继续向下执行
    • 使用:
      1. 当try中内容出现异常时,会立即开始匹配catch块,如果catch块匹配成功则程序继续执行,如果失败,则异常仍会出发程序仍然终止
      2. 可以存在多个catch块,自上而下的进行匹配
      3. 一个try-catch结构至多执行一个catch块
      4. 父类异常类型可以兼容匹配子类异常
      5. 父类异常需要写在子类异常之下
      6. 为了保证匹配一定成功,通常会在catch最下方匹配一个Exception
      7. 如果发生的是非运行时异常,则catch块无法捕捉与其无关的非运行时异常,编译报错
    • 异常信息处理:
      1. String getMessage():获取异常的详细信息
      2. void printStackTrace():打印输出异常的追栈(追踪)信息(异常类型+异常的详细信息+异常的触发位置)
  3. finally块

    • 特点:无论如何都会执行,通常用来关闭资源

    • 语法:

      try{
          
      }catch(){
          
      }finally{
          
      }
      
    • 使用;

      1. 必须与try结合使用,无法与catch单独结合
      2. 当try-catch-finally中出现return语句冲突时,优先执行finally

自定义异常

  1. 运行时异常:继承RuntimeException

    • 需要提供有参构造给最大父类Throwable中的详细信息属性赋值
    package com.by.exception;
    
    /**
     * 自定义运行时异常类
     */
    public class MyRuntimeException extends RuntimeException{
        public MyRuntimeException(){
    
        }
    
        public MyRuntimeException(String message) {
            super(message);
        }
    }
    
  2. 非运行时异常:继承Exception

    • 构造要求与运行时异常一致
    package com.by.exception;
    
    /**
     * 自定义非运行时异常
     */
    public class MyException extends Exception{
        public MyException(){}
    
        public MyException(String message) {
            super(message);
        }
    }
    

今日掌握

  1. 异常的完整分类
  2. throw和throws的区别
  3. try-catch-finally的使用
  4. 自定义异常的写法

你可能感兴趣的:(java,开发语言)