1. 异常体系分类认祖归宗Java中所有的异常和错误老祖宗都是Throwable。它生了两个重要的儿子Error错误这是绝症属于JVM层面的严重错误程序代码无法处理。典型代表OutOfMemoryError内存溢出OOM、StackOverflowError栈溢出无限递归导致。Exception异常这是得病程序本身可以捕获并处理的异常。分为两派受检异常Checked Exception编译期必须处理try-catch 或 throws否则代码都标红不让运行。例如IOException读写文件找不到、SQLException。非受检异常Unchecked / RuntimeException运行时阶段才会出现的异常编译器不强制要求处理。例如NullPointerException空指针第一杀手、IndexOutOfBoundsException数组越界。2. 核心考点Try-Catch-Finally 执行顺序踩坑面试官最喜欢出一段代码让你猜返回值publicstaticinttest(){inti1;try{i;inta1/0;// 发生异常}catch(Exceptione){i;returni;// 此时 i 3先保存这个返回值3再去走finally}finally{i;// i 变成了 4// 如果这里写了 return i; 就会覆盖 catch 里的返回值变成 4。}}必背铁律finally块里的代码一定会被执行除非在前面强制System.exit(0)。如果try或catch中有return语句finally还是会执行并且是在return执行前、真正将值返回给调用者前执行的。如果finally里面也有return则会覆盖掉 try/catch 里的返回值这是极度不推荐的写法属于反面教材。3. 最佳实践如何在实际开发中写异常不要直接捕获大类 Exception尽量捕获具体的异常如FileNotFoundException只在最后兜底时捕获Exception。生吞异常是大忌❌catch(Exception e){}绝对不行后续查Bug如同大海捞针❌e.printStackTrace();不推荐高并发下会导致锁竞争且无法进入日志系统。✅log.error(发生订单创建异常单号{}, orderId, e);标准动作。在 finally 中释放资源连接池、文件流必须在 finally 中close()或者使用 JDK 7 引入的try-with-resources语法糖自动关流优雅加倍。