-
Java集合对null支持不统一:HashMap等宽松派允许null,TreeMap等严格派因排序或并发歧义禁止null;Stream需filter或Optional处理null;推荐用emptyList、Optional、枚举替代null。
-
CompletableFuture异步异常处理需可感知、可分类、可恢复:exceptionally()用于统一兜底;handle()支持成功/异常双路径精细化处理;whenComplete()专注副作用清理;组合策略实现分层捕获与主动恢复。
-
应使用compareTo()比较BigDecimal金额,因其按数学值归一化后精确比较;equals()同时比较数值和精度,==比较引用,均不适用;需用字符串构造避免double精度误差,并确保非null。
-
反射获取注解实例须用getDeclaredAnnotation()而非isAnnotationPresent(),注意默认值非null、重复注解需用getDeclaredAnnotationsByType(),且注解值仅为编译期字面量。
-
NoSuchElementException发生在访问不存在的元素时,如空迭代器调用next()、Scanner无输入时读取、Optional为空调用get()等;应优先使用hasNext()、isPresent()等判断避免,而非依赖try-catch处理。
-
本文介绍一种不依赖eval()或反射变量名的优雅方式,通过函数式接口(Runnable)实现JButton的动态创建与行为定制,提升SwingGUI开发的可维护性与代码复用性。
-
FileOutputStream构造函数的第二个boolean参数控制是否以追加模式写入:true表示每次write前内核自动将文件指针移至末尾并原子性追加,不覆盖原内容,也不维护偏移量;false则覆盖。
-
@Async默认不生效,因需显式启用@EnableAsync且必须通过Spring代理调用;常见失效原因包括未启用异步支持、本类内直接调用、方法非public、使用this调用等。
-
ClassNotFoundException本质是反序列化时类名匹配但类路径无字节码,需从序列化源头一致性、类路径配置、版本兼容性三方面解决,优先使用JSON/Protobuf等显式Schema方案。
-
await()后线程进入condition队列:先新建CONDITION节点尾插,清理取消节点,再通过fullyRelease()释放锁并退出同步队列;signal()时迁移头节点至同步队列,CAS修改waitStatus后enq插入,再unpark;唤醒后需重新排队竞争锁,中断则不参与竞争。
-
死锁典型模式是多线程以不同顺序获取同一组锁,导致相互等待;预防需统一加锁顺序、使用tryLock超时机制及lockInterruptibly响应中断,并辅以jstack和ThreadMXBean检测。
-
Exception是程序运行中可预期、可恢复的问题,如文件不存在或网络超时;Error是JVM无法处理的严重故障,如OutOfMemoryError,不可恢复且不应捕获。
-
短路运算符的核心是“一旦结果确定,剩余部分不执行”。Java中&&和||从左到右求值,左侧能确定结果时右侧不再计算;而&和|为非短路运算符,始终计算两侧。例如false&&(++i>0)不执行右侧,i保持0;false&(++i>0)则执行右侧,i变为1。该机制常用于避免空指针异常(如obj!=null&&obj.isValid())和性能优化(将耗时操作置于右侧)。此外,&&优先级高于||,建议使用括号明确逻辑分组以提升可读性。掌握短路规则有助于编写安全高效的代码。
-
本文详解如何通过Mockito模拟InetAddress.getLocalHost()抛出异常,结合@SneakyThrows的实际行为,编写可覆盖异常分支的单元测试,并推荐使用AssertJ进行更精准的异常断言。
-
CGLIB必须生成子类因其基于字节码继承机制,通过ASM动态创建目标类的非final子类并重写方法;JDK代理仅实现接口,不依赖目标类结构,故无需继承且不受final限制。