java如何踩坑
常见的 Java 踩坑场景及规避方法
空指针异常(NullPointerException)
空指针是 Java 中最常见的运行时异常。未初始化对象或未检查 null 值直接调用方法会导致崩溃。
规避方法:使用 Optional 类包装可能为 null 的对象,或在调用前显式检查 if (obj != null)。对集合类使用 Collections.emptyList() 等工具方法替代 null。
字符串比较使用 == 而非 equals()== 比较对象内存地址,字符串常量池特性可能导致意外结果。例如 new String("a") == "a" 返回 false。
规避方法:始终使用 equals() 比较字符串内容,或对常量字符串调用 intern() 方法。
未正确重写 equals() 和 hashCode()
违反约定会导致集合类(如 HashMap)行为异常。例如两个逻辑相等的对象因 hashCode 不同无法在哈希表中匹配。
规避方法:遵循约定:重写 equals() 必须重写 hashCode(),且保证相同对象必须返回相同哈希值。
并发修改异常(ConcurrentModificationException)
在迭代集合时直接修改内容(如 for 循环中删除元素)会触发此异常。
规避方法:使用迭代器的 remove() 方法,或转为 CopyOnWriteArrayList 等线程安全集合。JDK 8+ 可用 Collection.removeIf()。
资源未关闭导致泄漏
文件流、数据库连接等未调用 close() 可能耗尽系统资源。即使调用也可能因异常跳过关闭逻辑。
规避方法:使用 try-with-resources 语法自动管理资源:
try (FileInputStream fis = new FileInputStream("file.txt")) {
// 使用资源
} // 自动调用 close()
性能相关陷阱
频繁字符串拼接使用 + 运算符
在循环中使用 + 拼接字符串会产生大量中间对象,消耗内存和 GC 时间。
规避方法:改用 StringBuilder 或 StringBuffer(线程安全场景)。
不当使用自动装箱/拆箱
隐式转换可能导致性能损耗和意外 NullPointerException。例如将 Integer 变量赋给 int 时若为 null 会崩溃。
规避方法:基础类型与包装类型混用时显式检查 null,性能敏感场景优先使用基础类型。
未合理配置 JVM 参数
默认堆内存设置可能导致 OOM 或频繁 GC。例如未设置 -Xmx 时大型应用容易内存不足。
规避方法:根据应用负载调整 -Xms、-Xmx、-XX:MaxMetaspaceSize 等参数,使用工具(如 VisualVM)监控 GC 行为。
高级特性注意事项
泛型类型擦除
运行时泛型类型信息会被擦除,导致 instanceof 检查和类型转换出现问题。
规避方法:通过传递 Class<T> 参数保留类型信息,或使用 Gson 等库的 TypeToken 机制。
反射破坏封装性
通过反射访问私有字段/方法可能绕过正常逻辑,引发安全问题或维护困难。
规避方法:限制反射使用范围,必要时调用 setAccessible(true) 后需重置状态。

Lambda 表达式变量捕获
Lambda 中使用的局部变量必须是 final 或等效 final,修改捕获变量会导致编译错误。
规避方法:使用原子类(如 AtomicInteger)或数组容器间接修改值。






