
一、异常基础认知1. 异常定义程序正常运行流程中发生的非正常错误状况会打乱原有代码执行逻辑。2. 异常处理提前编写对应备用代码当异常触发时自动执行备用逻辑避免程序直接崩溃。3. 处理异常的实际价值降低程序故障带来的数据、业务损失向用户输出友好提示文字方便开发人员定位、调试程序问题。二、异常整体层级划分面试核心考点1. 顶层父类ThrowableJava中所有错误、异常的统一根类归属java.lang核心包内置两个调试工具方法• String getMessage()获取简短异常描述文本多用于前端、用户提示展示• void printStackTrace()打印完整方法调用栈信息包含异常类型、出错代码行、调用链路是开发调试最常用方法2. 分支一Error 系统级错误Throwable的直接子类代表程序完全无法自行修复的严重底层故障开发者无需编写代码处理。常见场景JVM内存耗尽、递归深度超限栈内存溢出StackOverflowError、类加载失败等出现后程序直接强制终止。3. 分支二Exception 业务可处理异常程序运行中可以通过代码捕获、规避的故障分为两大分支1RuntimeException 运行时异常未检查异常所有直接/间接继承该类的异常统称运行时异常• 编译阶段编译器不会强制校验、强制处理代码写完即可编译通过仅在程序运行时报错。• 处理方案既可以捕获处理也可以放任不处理规范编码习惯能提前规避绝大多数运行时异常。• 高频常见类型① NullPointerException 空指针异常访问未初始化对象的属性/方法② ArrayIndexOutOfBoundsException 数组下标越界访问超出数组长度的索引③ ClassCastException 强制类型转换异常父子类无继承关系强转④ NumberFormatException 数字格式异常非数字字符串转数值类型2非RuntimeException 编译期异常已检查异常和RuntimeException无继承关系的Exception子类• 编译阶段编译器强制校验不编写处理代码则直接编译报错无法运行。• 处理要求代码中必须通过throws声明或者try-catch捕获处理。• 典型示例反射加载类Class.forName(类路径)、IO文件读写异常等。三、异常的两种产生方式1. 系统自动抛出异常• 触发条件执行存在逻辑漏洞、非法操作的代码时JVM自动识别并生成异常对象抛出。• 执行结果若无任何异常处理代码程序会立刻终止异常后方所有代码不再执行。2. 手动主动抛出异常开发高频用法业务逻辑校验不通过时开发者主动抛出异常中断流程关键字throw1. 固定语法throw new 异常类(自定义异常提示文字);2. 书写位置仅允许写在方法内部代码块中3. 执行效果等同于return语句立刻终止当前方法剩余代码异常向上传递四、异常的传递机制Java异常遵循方法调用链反向传递规则内层方法抛出异常后若自身没有捕获处理异常会逐层向上抛给调用它的上层方法最终传递至JVM虚拟机虚拟机收到未处理异常后直接终止整个程序。五、两类异常处理方案开发重点方案1消极处理——throws 声明抛出异常将异常处理责任转移给上层调用者属于推卸式处理关键字throws1. 书写位置方法声明末尾参数列表之后2. 完整语法修饰符 返回值 方法名(参数列表) throws 异常1,异常2{}3. 执行特点仅做异常声明不会拦截终止异常异常依旧会向上传递最终仍会导致程序崩溃4. 实用作用原本编译报错的受检异常通过throws声明后可以正常编译运行5. 多异常处理技巧可以直接声明父类异常利用多态统一处理该父类下全部子类异常方案2积极处理——try-catch 捕获拦截异常直接在当前代码块拦截异常异常被捕获后程序不会终止后续代码正常执行1. 基础语法模板try{// 存放有概率触发异常的业务代码}catch(异常类型 异常对象){// 对应异常触发时执行的补救、提示代码}2. catch多分支匹配规则• 一个try块后方可以跟随多个catch块异常触发时自上而下匹配匹配到第一个对应异常分支即执行后续catch不再校验。• 多catch书写顺序子类异常捕获分支必须写在父类异常分支上方否则编译报错。• 多态特性catch中声明父类异常可以捕获该类全部子类异常运行时异常无论代码是否存在对应风险catch都能捕获。拓展finally 最终执行代码块1. 语法结构拼接在全部catch分支之后try{// 风险代码}catch(异常类 e){// 异常处理逻辑}finally{// 无论try是否出现异常、catch是否执行本段代码一定会运行}2. 开发使用场景资源释放核心场景如关闭文件流、数据库连接、网络连接等。3. 编码规范不建议在finally中书写return返回语句会覆盖try、catch内的返回结果。4. 合法组合结构try-catch、try-catch-catch、try-catch-finally、try-finally、嵌套try-catch结构补充规则一个try只能搭配一个finally但可以搭配任意多个catchtry后必须至少存在一个catch或一个finally语法才算完整。六、自定义业务异常Java自带异常无法贴合业务场景时自行编写异常类区分业务故障分为两类1. 编译型自定义异常自定义类直接继承Exception抛出后属于受检异常编译强制处理。2. 运行型自定义异常自定义类继承RuntimeException抛出后属于运行时异常编译无强制校验。3. 规范构造方法必须提供两个构造器• 无参构造方法基础空参构造• 带String参数构造方法调用父类super(message)给Throwable父类赋值异常提示信息public class MyBusinessException extends Exception{public MyBusinessException(){}public MyBusinessException(String msg){super(msg);}}七、重写方法时的异常约束面试开发双重重点子类重写父类方法异常声明有三条硬性规则1. 方法基础匹配子类重写方法的方法名、参数列表、返回值类型必须和父类完全一致。2. 访问权限约束子类重写方法的访问修饰符权限和父类等同或者更宽松不能缩小权限。3. 异常抛出约束子类重写方法不能声明抛出父类方法未抛出、且层级更高的受检异常仅能抛出父类已声明的异常、该异常的子类或者完全不抛出异常。