数组越界异常本质是边界校验缺失,需先预防(访问前用if判断索引范围),再兜底(catch中记录日志而非仅打印提示)。

数组越界:表面是下标错,本质是边界校验缺失
典型写法:arr[i] 在 i >= arr.length 时触发 ArrayIndexOutOfBoundsException。
常见误区是只在 catch 里打印一句“越界了”,却不改逻辑。真正有效的处理分两步:
- 预防优先:访问前加判断,比如
if (i >= 0 && i - 捕获兜底:
try-catch用于无法预知索引来源的场景(如用户输入、外部数据),捕获后应给出明确反馈或降级策略,而不是静默吞掉 - 注意:JDK 9+ 提供了
Objects.checkFromIndexSize(i, 1, arr.length),比手写判断更安全、语义更清晰
空指针异常:不是对象没初始化,而是没做非空假设
NullPointerException 占运行时异常大半,根源常是调用链中某处返回了 null,而后续代码直接调用方法或访问字段。
实用应对方式:
- 方法入参校验:用
Objects.requireNonNull(obj, "obj must not be null")主动抛出带提示的NullPointerException,比等它在深处炸开更容易定位 - 返回值防御:调用可能返回
null的方法(如Map.get())后,先判空再使用;或改用Optional显式表达“可能为空” - IDE 配合:启用 @NonNull / @Nullable 注解(如 JetBrains 或 Lombok),让编译器提前报错
除零异常:数学错误背后是业务规则缺位
ArithmeticException: / by zero 看似简单,但往往暴露业务逻辑漏洞——比如“计算平均值”时没检查分母是否为零。
处理不能只 catch,要结合业务:
- 提前拦截:执行除法前判断分母是否为 0,是则走默认分支(如返回 0、抛
IllegalArgumentException、记录告警) - 区分场景:用户输入导致的除零,应提示“请输入有效数值”;系统内部计算出的 0,则可能是上游数据异常,需查日志而非仅提示
- 避免裸 catch:不建议
catch (ArithmeticException e)后只打印堆栈,要说明上下文,例如 “订单金额汇总时除数为零,订单ID: xxx”
文件/IO 异常:不是找不到文件,而是资源生命周期没管好
FileNotFoundException、IOException 属于受检异常,编译器强制你处理,这是好事——倒逼你思考“文件不存在怎么办?”“读取中断怎么收尾?”
- 优先用 try-with-resources:自动关闭流,避免因忘记
close()导致句柄泄漏 - 区分异常类型:文件不存在(
FileNotFoundException)可尝试创建默认文件;权限不足(SecurityException)需提示用户检查设置;网络 IO 中断(SocketTimeoutException)应重试而非直接失败 - 不要用
e.printStackTrace()上生产:换成结构化日志,记录操作、路径、用户 ID 等上下文信息
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











