Ja va 中的 RuntimeException 是非受检异常,编译时不强制你处理,但它在运行时冷不丁冒出来,往往意味着代码逻辑有硬伤。排查这类问题的思路,其实不在于“怎么捕获”,而在于“怎么预防”和“怎么快速定位”。下面按常见子类逐一拆解,结合实际场景聊一聊。

空指针异常(NullPointerException)

这是最老熟人的异常了——本质就是你调了一个 null 对象的方法或字段。排查时先看日志堆栈的第一行,定位到报错位置,弄清楚是哪个变量为 null。然后顺着调用链往回追:这个变量是从哪来的?是方法参数没传对?对象属性没初始化?还是某个方法的返回值直接用了没判空?

主动防御也很简单:对可能为 null 的入参,用 Objects.requireNonNull(str, "str must not be null") 提前拦截;对返回值用 Optional 包装;IDE 的 @NotNull 注解也可以辅助静态检查。习惯养成之后,空指针出现的概率会大幅下降。

数组/字符串索引越界(ArrayIndexOutOfBoundsException / StringIndexOutOfBoundsException)

下标跑到合法范围之外(小于 0 或者大于等于 length),就会抛出这个异常。报错信息里通常会直接给出索引值,比如 Index: 5, Size: 3,一眼就能看出越界了多少。接着检查循环条件:是不是用了 <= 而不是 <?有没有忘记判断 list.size() > 0

更根本的做法是避免硬编码下标,多用 for-eachstream 替代传统 for 循环,这类问题几乎就能杜绝。

类型转换与参数异常(ClassCastException / IllegalArgumentException / NumberFormatException)

这三个异常经常扎堆出现:错误传参 → 解析失败 → 强转崩溃,一条链上的问题。排查时各有侧重:

算术与状态类异常(ArithmeticException / IllegalStateException / UnsupportedOperationException)

这类异常往往暴露的是设计或调用时机的问题。

说到底,RuntimeException 的排查思路就是“预防为主,定位为辅”。把防御性编程的习惯融入日常,配合日志堆栈的快速定位,这类问题就不会成为噩梦。

本文转载于:https://www.php.cn/faq/2823474.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。