Chp17-异常

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

分类

  1. Throwable:总父类

  2. Error:错误

    • 无法提前避免和解决

    • 通常由硬件设备或内存问题导致

  3. Exception:异常

    • 可以提前避免或解决

    • 通常由代码导致

    • RuntimeException:运行时异常,也称为未检查异常、未检异常等

      • 编译不报错,运行出错

      • 可以选择性的处理

      • java.lang.NullPointerException:空指针异常

      • java.lang.IndexOutOfBoundsException:下标越界异常

      • java.lang.NumberFormatException:数据类型转换异常

      • java.lang.ClassCastException:类型转换异常

      • java.lang.ArithmeticException:数学运算异常

      • ...

      • 运行时异常都属于java.lang包

    • 非运行时异常:也称为已检查异常、已检异常等

      • 编译就会报错

      • 必须做出处理

      • 只要不是运行时异常,则一定是非运行时异常

异常的产生

  1. 自然产生: 编译或执行到有问题的代码时,会自动产生异常

  2. 手动产生:

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

    • 执行:当执行或编译到该语句时,会抛出一个异常,程序终止

    • 该语句同一直属作用范围内,下方不可存在其他有效语句

      • 原因:无法执行

可以使程序停止执行:

  1. 代码运行完毕

  2. 执行到异常

  3. 在非递归的情况下运行到return;

public class Test2 {
    public static void main(String[] args) {
        System.out.println("main开始");
        ma();
        System.out.println("main结束");
    }
​
    public static void ma(){
        System.out.println("ma开始");
        //手动抛出异常
        throw new RuntimeException();
​
        //System.out.println("ma结束");
​
    }
​
}

异常的处理

  1. 上抛异常:消极处理

    访问修饰符 返回值类型 方法名()throws 异常类名1,异常类名2,..{
        
    }
    • 特点:方法自身不处理异常,将异常上抛给调用者,该解决方式无法根治问题,如果异常最终上抛至虚拟机,则程序仍然强制终止

    • 使用:

      1. 上抛父类异常可以解决处理内部的子类异常

      2. 调用者需要处理的异常类型由throws声明决定

    public static void main(String[] args)throws Exception {
            System.out.println("main开始");
            mb();//Exception
            System.out.println("main结束");
        }
    ​
        public static void mb()throws Exception{
            //抛出一个非运行时异常
            throw new ActivationException();
        }
  2. try-catch:积极处理

    try{
        //有可能出现异常的代码
    }catch(有可能匹配的异常类型 引用名){
        //处理代码
    }    
    • 特点:将有可能出现异常的代码放入try中,当发生异常时,如果有对应的catch块解决异常,则异常被消化,程序可以继续向下执行

    • 使用:

      1. 若catch匹配都不成功,则程序仍然终止

      2. catch块可以存在多个

      3. 父类异常可以匹配子类异常

      4. 为了保证try-catch结构一定执行成功,通常会在最下方catch一个Exception

      5. 父类catch块必须写在子类catch块的下方

        • 原因:catch块自上而下匹配且最多执行一个,父类catch块写在上方会导致子类catch块无效

finally块

通常结合try-catch块使用,用于关闭释放资源

try{
    
}catch(){
    
}finally{
    
}
  • 写在try-catch结构的最下方

使用
  1. 不受try-catch影响,无论如何都会执行

  2. 可以和try单独结合使用,表示try中代码无论执行结果怎样finally中都会运行

  3. 不可以和catch单独结合

  4. 不可以独立存在

  5. 当try-catch-finally中出现return语句冲突时,优先执行finally

方法补充:

为了方便查看和处理异常,Throwable中提供了对应方法:

  1. String getMessage():获取异常的详细信息

  2. void printStackTrace():输出异常的追栈信息(异常类型、详细信息、触发位置)

        try {
            System.out.println(10 / 0);
        } catch (Exception e) {
            System.out.println("未知异常!");
            System.out.println("详细信息:" + e.getMessage());
            System.out.println("追栈信息:");
            e.printStackTrace();
        }

自定义异常

  1. 运行时:继承RuntimeException,提供无参有参构造(调用父类有参构造给Throwable中的详细信息属性赋值即可)

    /**
     * 运行时异常
     */
    public class MyRuntimeException extends RuntimeException {
        public MyRuntimeException(){
    ​
        }
    ​
        public MyRuntimeException(String message) {
            super(message);
        }
    ​
    }
  2. 非运行时异常:继承Exception,提供有参无参构造

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

今日掌握

  1. 异常的分类

  2. throw和throws的区别

    1. 作用:throw是抛出制造异常,throws是上抛解决异常

    2. 位置:throw是写在方法内部,throws是写在方法声明处

  3. try-catch-finally的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值