Java异常处理机制

  • 异常概述

    • Exception及Error的概念、区别
      • 异常:指程序运行时发生的不正常事件;异常能够被异常机制处理,保证程序继续运行下去;例如:除数为零、文件没有找到、输入数字格式不对。
      • 错误:指示合理的应用程序不应该试图捕获的严重问题。错误不能被程序处理。发生错误后jvm一般会终止程序运行。解决需要我们修改源代码例如:内存泄漏
  • Exception的层次关系

    • API中标准异常的继承树关系

      • API标准异常的顶级父类 Throwable类; //注意是类哦
      • Throwable类有两个子类:Exception和Error;所有异常都是Exception类的直接或间接子类;所有错误都是Error的直接或间接子类;
    • 运行时异常与非运行时异常的区别

      • Exception分类
        • 运行时异常:
          • RuntimeException的子类都是运行时异常,其他都是非运行时异常。
          • 也称非检测性异常,这些异常在编译器不检测,程序可选择处理与否。但是如果不处理运行时会中断。编译不会出问题。
        • 非运行时异常
          • 也称检测性异常,必须进行处理,不处理,会发生编译期错误
    • 常见运行时异常的概念(空指针、数学、格式、造型)

      • RuntimeException的子类都是运行时异常

      • NullPointerException–空指针异常

        • 发生条件:当一个空对象,即没有初始化,依然为null的对象调用属性或方法时
        • 这个异常一般不捕获。
      • ArithmeticException-算术异常

        • 发生条件:整数除以0
      • IndexOutOfBoundException-索引越界异常

        • 包括StringIndexOutOfBoundException

          和ArrayIndexOutOfBoundException

        • 发生条件:访问字符串或数组元素,超过长度时。

      • NumberFormatException-数字格式异常

        • 发生条件:将把一个字符串转换为数字,而字符串内容不是数字时。
      • ClassCastException-类型转换异常

        • 发生条件:把父类对象转换为不相关的子类类型时。
    • 非运行时异常在编译器检测的特性

      • 编译期会被检测,并强制要求处理这类异常,不处理就会报错
      • 常见非运行时异常:IOException 、SQLExeption
  • 异常处理流程及语句

    • Java异常处理的标准流程

      抛出异常-运行时异常JVM自行抛出,非运行时异常使用throw抛出
      捕获异常-catch语句捕获
      捕获成功-catch的异常类型与抛出的异常类型匹配
      	异常被处理,程序继续运行
      (捕获失败-catch的异常不匹配
      	程序中断执行)
      
    • try代码块

      • 放置所有可能抛出异常或肯定抛出异常的代码
    • catch语句

      • 用于捕获异常,匹配就运行catch中语句

      • 可能发生3中情况

        1. 发生异常并捕获成功
        2. 发生异常捕获失败
        3. 未发生异常
      • catch语句一般写:

        • 任意对异常处理的代码
        • 调用异常对象的方法,例如printStackTrace
      • 对于多个异常要做相同处理的时候

        • 可以使用|
        try {
        		int num=s.nextInt();
        		System.out.println(num);
        		//throw new ClassCastException("人为创造的一个类型转换异常");
        		System.out.println(19/0);
        		}catch (ArithmeticException|ClassCastException e) {
        		e.printStackTrace();
        		}finally {
        			s.close();
        		}
        //这里表示对于算术异常和类型转换异常我们做的是同一个处理
        

    • 多个catch

      • 可能抛出多种类型异常时使用
      • 注意:Catch语句的异常类型必须从子类到父类的顺序,否则编译失败。(因为异常只要被成功捕获一次,被处理后,就不会继续抛出了)
    • finally块

      • 希望不管什么情况,都要执行的代码卸载finally块。
    • catch及finally的可选特性

    • finally与return

      • 前面有return 仍然执行
      • 前面有System.exit(0) 不被执行
    • throw与throws

      • 抛出异常:创建一个异常对象,然后使用throw关键字交给异常处理机制去处理;

      • 使用方式:

        throw 异常对象;
        例如
        throw new Exception();catch(Exception e){
          throw e;
        }
        
      • 对于运行时异常,JVM自行执行一条抛出语句

        throw new ArithmeticException();
        
      • 运行时异常JVM自行抛出,非运行时异常需要程序员throw抛出;//在我们觉得异常应该被处理的地方抛出异常

        ​ 然后根据流程我们有两种方式:

        1. try/catch/finally进行处理

        2. 不处理,使用throws声明异常

          • 注意:如果调用第一种方式,异常在try/catch块中就被处理,我们不能再捕获到这个异常了。

            所以我们通常使用第二种方式进行声明,这样会很灵活。

      • throws:位于方法声明处,声明方法中可能发生的异常。

        • 使用throws,当我们调用方法时,编译器会提醒我们要处理这些异常,否则就会编译错误。
  • 自定义异常

    • 自定义异常的意义
      1. 为了不与API中的标准异常混淆
      2. 当我们需要根据业务需求定义业务异常
    • 自定义异常声明和使用
      • 实现方式:继承API中任意一个标准异常类
      • 通常继承Exception类
      • 一般自定义异常类不写其他方法,只重载必要的构造方法
        • 因为构造方法不会被子类继承。
  • 断言

    • 断言的作用
    • 断言的使用
  • 运行时异常和非运行时异常的区别为什么运行时异常使用多。

  • try/catch/finally 可以嵌套在try块、catch块、finally块。

  • 抛出异常与 try/catch块的区别

    • 抛出异常:一般
  • 异常堆栈:异常从内到外抛,方法从外向里调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值