Chp18-异常

Chp18-异常

概念

程序运行中由代码导致的不正常情况

分类

  1. Throwable: 总父类,表示所有不正常情况

  2. Error: 错误

    • 无法解决也无法提前避免
    • 通常由硬件问题|JVM问题|内存问题等导致
  3. Exception: 异常

    • 可以解决也可以提前避免

    • 通常由代码导致

    • 分类:

      1. RuntimeException: 运行时异常,也成为未检查异常|未检异常等

        • 特点: 编译不报错, 运行报错

        • 可以选择性处理

        • 示例:

          java.lang.ArithmeticException: 数学运算异常
          java.lang.NullPointerException: 空指针异常
          java.lang.ArrayIndexOutOfBoundsException: 数组下标越界异常
          java.lang.StringIndexOutOfBoundsException: 字符串下标越界异常
          java.lang.IndexOutOfBoundsException: 下标越界异常
          java.lang.NumberFormatException: 数据类型转换异常
          java.lang.ClassCastException: 类型转换异常
              ...
          基本来自java.lang包
          
      2. 非RuntimeException:非运行时异常, 也成为检查异常|已检查异常|已检异常等

        • 特点: 编译报错
        • 必须处理
        • 只要不是运行时异常,就一定是非运行时异常

异常的产生

  1. 自然产生: 当JVM运行至有问题的代码时, 会自然报出对应异常

  2. 手动产生:

    throw 异常对象;
    
    • 位置: 方法内部

    • 运行: 当程序执行到该语句时, 抛出指定的异常对象, 程序会终止

      • 抛出运行时异常对象: 编译不报错,运行再抛出
      • 抛出非运行时异常: 在编译时抛出报错
    • 使用: 直属作用范围内正下方不可存在其他有效语句

    • 程序结束运行的方式:

      1. 自然结束: 代码运行结束
      2. 运行到异常
      3. 在非递归环境下执行到return;

异常的处理

  1. throws: 上抛异常, 消极处理

    访问修饰符 返回值类型 方法名(形参列表)throws 异常类名1,异常类名2,..{
        
    }
    
    • 原理: 将异常上抛至调用者, 自身不处理异常, 如果调用者也选择上抛未处理异常, 则异常最终会抛至虚拟机, 程序仍然会终止

    • 特点: 问题不会被根治, 只能让当前方法暂时规避异常风险

    • 使用:

      1. 上抛父类异常可以兼容处理子类异常对象
      2. 调用者需要处理的异常类型与方法上抛的声明一致
    • 与throw关键字的区别:

      1. 作用上:
        • throw用来抛出制造异常
        • throws用来上抛处理异常
      2. 位置上:
        • throw写在方法内
        • throws写在方法()与{}之间声明处
      3. 语法上:
        • throw后方为异常对象
        • throws后方为异常类名
    	public static void main(String[] args)throws Exception {
            System.out.println("main开始");
            method();
            System.out.println("main结束");
        }
    
        public static void method()throws Exception{
            System.out.println("method开始");
            //抛出一个非运行时异常
            throw new IOException();
        }
    
  2. try-catch: 捕捉并处理, 积极处理

    try{
        有可能出现异常的代码
    }catch(有可能匹配的异常类型 引用名){
        处理语句
    }
    
    • 执行: 当try中的内容发生异常时, catch块会捕捉匹配, 当匹配成功时, 执行对应catch块中的处理语句

    • 可以真正解决问题, 程序将不再终止

    • 使用:

      1. 当try中存在非运行时异常时, catch块必须做出对应异常的捕捉, 否则编译报错

      2. 当try中出现异常, 会立即开始匹配catch块

      3. 需要为不同的异常提供各自的try-catch

      4. catch块可以存在多个

      5. catch匹配顺序: 自上而下. 一旦有catch块匹配成功,则剩余catch将不再执行

        • 一个try-catch结构至多执行一个catch
      6. 为了保证匹配一定成功, 通常会在catch的最下方匹配一个Exception

      7. 父类异常可以匹配子类异常, 必须子类异常下方

      8. 异常对象的操作:

        1. String  getMessage(): 获取异常的详细信息
        2. void printStackTrace(): 打印输出异常的追栈信息(异常类型+异常的详细信息+异常的触发位置)
        

finally

finally{
    
}

使用

  1. 位置: 通常写在try-catch的最下方
  2. 执行特点: 无论如何都会执行, 不受try|catch的影响
  3. 作用: 通常用来关闭释放资源
  4. finally可以和try单独结合, finally和catch都无法脱离try块存在
  5. 当try-catch-finally中出现return语句冲突时, 优先执行finally

自定义异常

  1. 运行时异常: 继承RuntimeException
  2. 非运行时异常: 继承Exception

操作

书写有参无参构造, 利用有参构造给父类Throwable中的detailMessage详细信息属性赋值, 方便后续调用异常对象的getMessage()

/**
 * 自定义运行时异常
 */
public class MyRuntimeException extends RuntimeException{
    public MyRuntimeException(){}

    public MyRuntimeException(String message) {
        super(message);
    }
}
/**
 * 自定义非运行时异常
 */
public class MyException extends Exception{

    public MyException(){}

    public MyException(String message) {
        super(message);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值