-
Java中无法重写addSuppressed()来处理关闭异常,因其是Throwable类的final方法,仅存储抑制异常而不执行逻辑;正确做法是在close()中捕获并决策、避免抛出检查异常、利用getSuppressed()分析抑制异常、实现幂等close(),或分离close()与显式释放方法。
-
Java环境配置完成后IDE仍提示无JDK,通常是路径未手动指定、版本不兼容、缓存冲突或环境变量未被IDE正确继承所致,需依次检查JDK路径配置、IDE版本支持范围、启动JRE一致性、系统环境变量加载方式及清除IDE缓存。
-
目标是为不同集合类型、数据规模和操作性质划定推荐路径与禁用红线,而非单纯追求性能;例如10万级ArrayList用for循环合理,而同量级LinkedList禁用for循环;当热点方法占比超40%且无状态依赖时,需配套静态检查规则拦截高危写法。
-
jstat-gcutil可实时监控FullGC后老年代内存是否真实释放,关键看OU是否明显下降;若OU降幅极小或快速回升,则可能存在内存泄漏。
-
Lambda表达式优化MyBatis参数处理,通过方法引用替代字符串硬编码实现编译期校验,支持IDE自动补全与重构同步;多条件用Predicate集合分离业务逻辑与SQL构建;模糊查询前置判空;单查推荐oneOpt()配合Optional安全兜底。
-
为什么&和&&不能混用?Java里&是位与,&&是逻辑与,语义和行为完全不同。误用会导致短路失效、空指针或计算错误。&&遇到第一个false就停,不执行右边表达式;&一定两边都算,哪怕左边已是0对布尔变量用&不报错但失去短路保护,比如obj!=null&obj.getValue()>0可能触发NullPointerException对整数必须用&,&&编译直接失败:inta=5&3合法,5&&3编译报错badoperandtypes
-
多个catch块必须子类在前、父类在后;多异常捕获(|)要求类型互不继承;兜底异常不可过宽;catch内抛异常不会触发后续catch。
-
异常统一流式转化引擎的核心是将异常识别、语义归一、补偿触发、执行校验四环节串成可观测、可配置、可回溯的数据流,实现补偿从硬编码if-else到事件驱动策略流水线的升级。
-
最常用方式是使用UUID.randomUUID()生成128位唯一标识,该方法线程安全且基于随机数生成版本4的UUID,适用于大多数业务场景。
-
静态变量为空通常因类未初始化,而非代码错误;需依据JVM规范确认5种主动引用场景(new、静态方法、非final静态字段、反射、子类初始化)是否触发<clinit>执行。
-
排查多租户内存残留需聚焦ThreadLocal未清理、TTL传播异常、静态强引用及上下文生命周期错配:先用jstack/Arthas查线程级上下文持有,再用jmap分析实例数,结合GC日志确认老年代残留,最后审计静态变量、缓存key设计与clear()的try-finally覆盖。
-
必须用CyclicBarrier而不是CountDownLatch的场景是多轮重复同步,即每轮所有线程必须互相等待到齐才共同推进,因其可自动重置复用,而CountDownLatch一次性不可重用。
-
getOrDefault能替代if-else空判断,因其将“查不到就用默认值”逻辑封装为一次调用,语义明确、性能更优,但不写入Map且无法区分null是未命中还是真实值。
-
@Retention声明注解保留阶段,需用javap-v查字节码中RuntimeVisibleAnnotations等属性,并结合反射实测验证:SOURCE级不出现,CLASS级可见但反射不可获取,RUNTIME级既可见又可反射获取。
-
模块描述文件强制依赖分层的核心是将架构约束转为机器可验证契约,在编译或CI阶段拦截越界访问;需选对载体(如ArchUnitDSL、ArchGuard配置或Java模块元数据),覆盖字段、方法参数、泛型、注解四类变量级依赖场景,并配套CI卡点、IDE提示与修复模板。