-
Spring 默认通过 AOP 代理处理 @Transactional,类内 this 自调用会绕过代理。本文用调用路径、拆分服务、代理引用和回滚验证说明如何定位并修复事务边界问题。
-
Java JFR 降低诊断开销的关键不是关闭记录,而是先选对配置,再按事件设置 period、threshold 和 stackTrace,最后检查 JFR 文件是否包含足够证据。
-
Java sealed interface 扩展失败时,先检查 permits 中的类型是否可访问且确实直接 implements 或 extends 该接口,再核对 final、sealed、non-sealed 续封修饰符,最后区分 named module 与 unnamed module 的包边界。本文用最小编译矩阵逐项定位这些错误。
-
Java record 的字段是 final,但组件对象未必不可变。把带 List 等可变组件的 record 当作 HashMap 键时,组件内容变化会让 hashCode 改变,导致 get 或 containsKey 定位失效。
-
Stream.toList() 从 Java 16 起返回不可修改的 List。本文说明它与 Collectors.toList()、toUnmodifiableList() 和 toCollection(ArrayList::new) 的差异,并给出 UnsupportedOperationException、Java 版本和 null 边界的排查方法。
-
Java CompletableFuture 里的 exceptionally、handle 和 whenComplete 都能接住异常,但职责并不相同。本文用一条可运行的订单校验流水线说明三者的返回值、异常传播、旁路记录和质量门禁边界,帮助你把失败处理放在正确的位置。
-
ClassValue 适合把与 Class 绑定的元数据懒加载并缓存起来。本文用一段可运行示例拆开 get、类型值计算、remove 的关系,并说明它与普通 Map 缓存、类卸载之间的边界。
-
用 Java Locale.Builder 校验用户提交的 BCP 47 语言标签,区分 setLanguageTag 与 forLanguageTag 的异常和截断行为,并给出回退语言、展示语言与测试验收方案。
-
Locale.forLanguageTag 会按 BCP 47 规则解析并规范化语言标签。本文从缓存键异常复盘出发,解释大小写、非法子标签、Unicode 扩展和 toString/toLanguageTag 的边界,并给出可验收的修复方式。
-
Java Pattern.asMatchPredicate 可以把完整字符串匹配封装成 Predicate,再交给 Stream.anyMatch 短路查找。本文用订单号校验场景对比 asMatchPredicate 与 asPredicate,说明 null、空流和正则边界。
-
Java try-with-resources 中,主体代码和 close() 同时抛异常时,主体异常继续向外传播,关闭异常会被保存到 suppressed 列表。本文用一个可复用的排查场景说明关闭顺序、异常主次与 getSuppressed() 的读取方式。
-
JDK 26 的预览 API PEMEncoder 可以通过 withEncryption 加密并输出私钥类对象。本文说明不可变实例、支持类型、密码数组和预览编译参数的实际边界。
-
List 调用 remove(1) 时,Java 会优先匹配 remove(int),删除下标为 1 的元素;如果要按值删除整数,应显式使用 Integer.valueOf(1)。本文再补充 removeIf、不可修改列表和 subList 的边界。
-
用 Java ScopedValue 传递请求上下文时,绑定位置、线程边界和版本 API 是最容易出错的地方。本文给出配置示例与排查清单。
-
Java 批量校验邮箱、手机号等字段时,反复编译 Pattern 和把 Matcher 跨线程复用,都会让接口延迟抬头。本文从 Pattern、Matcher 的职责边界出发,对比错误写法与复用写法,再用 JMH 风格基准和业务验收检查性能收益。