初学异常处理应聚焦“异常发生时程序往哪跳”的动作逻辑:try一定先执行且是唯一入口,出错则立即跳转至匹配的catch,未匹配则向外抛出;finally暂不引入以降低认知负担。

初学时不用死记语法,重点是抓住“异常发生时程序往哪跳”这个动作逻辑。try 和 catch 不是并列结构,而是“尝试执行 → 出错就跳转处理”的响应关系。理清脉络,关键看三点:谁先跑、谁接管、谁兜底。
try 是唯一入口,代码从这里开始跑
所有受保护的代码必须写在 try 块里。它不是“可能执行”,而是“一定先执行”。哪怕只有一行正常语句,也得先走完这行(或走到出错那行为止),才考虑要不要进 catch。
- 没异常:try 全部执行完,直接跳过所有 catch,继续往下走
- 有异常:一旦某行抛出错误,try 后面的剩余代码立刻停住,不执行
- 异常位置很关键:比如
int a = 1 / 0;这行出错,它后面的语句(哪怕只隔一行)就不会运行
catch 是“匹配式跳转”,不是所有错误都进同一个
catch 不是通用回收站,它只接收自己声明能处理的异常类型。程序会按顺序检查每个 catch,找到第一个类型匹配的就进去,其余跳过。
- 子类异常要写在父类前面(如
FileNotFoundException在IOException前) - 一个 try 可以跟多个 catch,但每次最多只进其中一个
- 如果没写任何 catch,或者写了但类型不匹配,异常就往外抛,不会静默吞掉
用最简代码验证执行路径
动手写两段对比代码,比看十遍流程图更管用:
- 第一段:try 里放
System.out.println("A"); throw new RuntimeException(); System.out.println("B");—— 你会看到只输出 A,B 不出现 - 第二段:加上
catch(RuntimeException e) { System.out.println("C"); }—— 输出变成 A、C,证明跳转生效 - 再加个
catch(Exception e)在后面,实际不会进,因为第一个已匹配
别急着加 finally,先盯紧 try→catch 这条线
初学阶段把 finally 暂时屏蔽掉(注释或删掉),专注观察 try 和 catch 的切换时机。等你能准确预测“第几行出错 → 进哪个 catch → 下一句执行哪”之后,再把 finally 加回来补上“收尾必做”的约束。这样分步建立认知,不容易被多层嵌套绕晕。











