Abel's tech blogAbel's tech blog
  • 基础知识
  • 面向对象
  • IO流
  • String
  • 异常处理机制
  • 多线程
  • 反射机制
  • JVM相关知识
  • 数据库基础
  • 数据库进阶
  • 复杂SQL语句
  • Redis
  • Spring-IOC
  • Spring-AOP
  • Spring-Test
  • SpringBoot
  • SpringMVC
  • MyBatis
  • 基于MyBatis的分页查询
  • SpringSecurity
  • 微服务概念
  • Nacos
  • Dubbo
  • Seata
  • Sentinel
  • SpringGateway网关
  • ELK
  • Quartz
  • 消息队列
  • 数据结构
  • 算法
  • TCP/IP
  • 交换机
  • 路由器
  • Docker
  • Kubernetes
  • Linux
  • 各类工具

    • 菜鸟工具
    • 菜鸟教程
    • IDEA下载
    • 数据结构和算法可视化网站
    • jwt解析
    • maven仓库
  • 开发文档

    • Java 8 API 文档
    • Java 17 API 文档
    • MyBatis 3 中文
    • MyBatis-spring 中文
    • Spring Framework 5 API DOC
    • Spring Framework 6 API DOC
    • SpringBoot 2.7.6 API DOC
    • SpringBoot 3 API DOC
    • Hypertext Transfer Protocol -- HTTP/1.0
  • 配置文件下载

    • 阿里云Maven仓库配置
    • Nginx反向代理配置模板
    • JavaScript组件库
  • JDK 8 Windows x86 64-bit
  • JDK 17 Windows x86 64-bit
  • Maven
  • IntelliJ IDEA 各版本
  • Git
  • 基础知识
  • 面向对象
  • IO流
  • String
  • 异常处理机制
  • 多线程
  • 反射机制
  • JVM相关知识
  • 数据库基础
  • 数据库进阶
  • 复杂SQL语句
  • Redis
  • Spring-IOC
  • Spring-AOP
  • Spring-Test
  • SpringBoot
  • SpringMVC
  • MyBatis
  • 基于MyBatis的分页查询
  • SpringSecurity
  • 微服务概念
  • Nacos
  • Dubbo
  • Seata
  • Sentinel
  • SpringGateway网关
  • ELK
  • Quartz
  • 消息队列
  • 数据结构
  • 算法
  • TCP/IP
  • 交换机
  • 路由器
  • Docker
  • Kubernetes
  • Linux
  • 各类工具

    • 菜鸟工具
    • 菜鸟教程
    • IDEA下载
    • 数据结构和算法可视化网站
    • jwt解析
    • maven仓库
  • 开发文档

    • Java 8 API 文档
    • Java 17 API 文档
    • MyBatis 3 中文
    • MyBatis-spring 中文
    • Spring Framework 5 API DOC
    • Spring Framework 6 API DOC
    • SpringBoot 2.7.6 API DOC
    • SpringBoot 3 API DOC
    • Hypertext Transfer Protocol -- HTTP/1.0
  • 配置文件下载

    • 阿里云Maven仓库配置
    • Nginx反向代理配置模板
    • JavaScript组件库
  • JDK 8 Windows x86 64-bit
  • JDK 17 Windows x86 64-bit
  • Maven
  • IntelliJ IDEA 各版本
  • Git

异常处理机制

TIP

java中所有错误的超类为Throwable,其下有两个子类:Error和Exception
Error的子类描述的都是系统错误,比如虚拟机内存溢出等
Exception的子类描述的都是程序错误,比如空指针、下标越界
通常程序中处理的异常都是Exception

异常处理机制中的try-catch

  • 语法

    try{
      可能出现异常的代码片段
    }catch(XXXException e){
      出现异常后的处理代码
    }
    

    注意

    try语句不能独立存在,后面必须跟catch或者finally

异常处理机制中的finally

  • finally块定义在异常处理机制中的最后一块。它可恶意直接跟在try之后,或者最后一个catch之后
  • finally可以保证只要程序执行到try语句块中,无论try语句块中的代码是否出现异常,最终finally都必定执行
  • finally通常用来释放资源这类操作

自动关闭特性

JDK7之后,java提供了一个新的特性:自动关闭。指在IO操作中可以更简洁的使用异常处理机制完成最后的close操作

  • 语法:

    try(
      定义需要在finally中调用close方法关闭的对象
    ){
      IO操作
    }catch(XXXException e){
      ···
    }
    

    上述语法中可以在try的“()”中定义的并初始化的对象必须实现了java.io.AutoCloseable接口,否则编译不通过

throw关键字

throw用来对外主动抛出一个异常,通常下面两种情况主动对外抛出:

  • 当程序遇到一个满足语法,但是不满足业务要求是,可以抛出一个异常给调用者
  • 程序执行遇到一个异常,但是该异常不应当在当前代码片段被解决时可以抛出给调用者

throws关键字

当一个方法中使用throw抛出一个非RuntimeException异常时,就要在给方法上使用throws声明这个异常的抛出,此时调用该方法的代码就必须处理这个异常,否则编译不通过,处理手段有两种:

  • 使用try-catch捕获并处理这个异常

  • 在当前方法上继续使用throws声明该异常的抛出给调用者解决

    永远不应当在main方法上使用throws

Java异常可以分为两种:

  • 可检测异常:可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常,编译器就通不过,不允许编译
  • 非检测异常:非检测异常不遵循处理或声明规则。在生产次类异常时,不一定非要采取任何适当操作,编译器不会检查是否已经解决了这样一个异常
  • RuntimeException类属于非检测异常

常见的RuntimeException子类

  • IllegalArgumentException:抛出的异常表明箱方法传递了一个不合法的参数
  • NullPointException:当应用程序试图在需要对象的地方使用null时,抛出该异常
  • ArrayIndexOutOfBoundsExcetion:当使用的数组下班超出数组允许范围是,抛出该异常
  • ClassCastException:当试图将对象强转为不是实例的子类是,抛出该异常
  • NumberFormatException:当应用程序视图将字符串转换成一种数值类型,但该字符串不能转换为适当格式是,抛出该异常

自定义异常

自定义异常通常用来定义哪些业务上的异常问题

定义自定义异常需要注意的问题:

  • 异常的类名要做到见名知意
  • 需要是Exception的子类
  • 提供超类异常提供的所有种类构造器