语法、类型系统与异常处理

共 99 题
#

1. CompletableFuture 链中的 CompletionException 应在哪一层解包,才能避免重复包装和错误重试

A 应在链的最外层边界统一解包一次,避免重复包装和错误重试 ✓ 正确答案
B 每个中间阶段都应调用 get() 并解包,以尽早暴露异常
C CompletionException 永远不会产生新的分配,解包成本可忽略
D 只要捕获了 CompletionException 就说明原异常已丢失,无法恢复 cause
#

2. JVM 如何对异常做栈展开(Stack Unwinding)的成本

A 每个 try/catch 都会在正常路径上产生显著的栈遍历开销
B 异常表只在解释执行时生效,JIT 编译后不再使用
C 栈展开只发生在当前方法内,不会跨方法传播
D JVM 用异常表精确匹配,正常执行 try 块几乎零成本,抛异常本身才昂贵 ✓ 正确答案
#

3. JVM 异常表(Exception Table)的字节码原理

A 异常表运行期动态生成,随异常类型变化
B 异常表只支持精确异常类型匹配,不支持子类
C finally 块不会出现在异常表中,只能靠 finally 字节码指令
D 异常表每条记录含 start/end/handler 字节码偏移与 catch_type,try/finally 会被编译成多条异常条目 ✓ 正确答案
#

4. OutOfMemoryError 在 G1 与 ZGC 下的堆转储(Heap Dump)触发行为与捕获建议

A ZGC 永远不会抛出 OutOfMemoryError
B G1 与 ZGC 的堆转储格式完全不同,无法用同一工具分析
C -XX:+HeapDumpOnOutOfMemoryError 会生成 hprof 文件供诊断,OOM 本身不可恢复,主打快速退出保留现场 ✓ 正确答案
D 捕获 OOM 后清理局部变量即可安全恢复程序
#

5. Spring Boot 4.0 如何用 ProblemDetail 统一映射领域异常,同时区分客户端错误与服务端故障

A 使用 @ControllerAdvice 后必须用 ErrorResponse 替代 ProblemDetail
B ProblemDetail 只能返回 500,无法表达 4xx
C ProblemDetail 是 Spring 自定义私有格式,不符合任何标准
D 客户端错误映射 4xx、服务端故障映射 5xx,通过 status 与稳定错误码区分并避免泄露内部细节 ✓ 正确答案
#

6. String 不可变性的设计意义与 JIT 优化(String Constant Pool)

A String 可变时哈希缓存也能正确工作,不可变性只是习惯
B 字符串常量池只存在于 JDK 6 及更早版本
C 不可变性带来线程安全、哈希缓存、常量池复用等优化基础,字面量相同内容在常量池中复用 ✓ 正确答案
D new String("x") 与字面量 "x" 总是引用同一对象
#

7. Unicode 与 UTF-16 在 JVM 中的字符存储(char/code point)

A char 就是 Unicode 码点,一个字符总是一个 char
B JVM 内部用 UTF-8 存储所有字符
C 所有 Unicode 字符都恰好占 16 位
D char 是 UTF-16 code unit,补充平面字符需两个 char 组成代理对,length() 与码点数可能不同 ✓ 正确答案
#

8. hashCode 与 equals 契约的细节、违反契约时集合行为

A equals 相等时 hashCode 必须相等,但 hashCode 相等时 equals 不必相等 ✓ 正确答案
B 可变对象作键是安全的,因为集合会重算哈希
C 只需实现 equals,hashCode 可任意返回常量
D 违反契约只影响效率,不影响正确性
#

9. 在 finally 中抛出异常的覆盖与栈丢失

A finally 抛出的异常会覆盖 try 的原始异常导致栈丢失,try-with-resources 用 addSuppressed 保留 ✓ 正确答案
B finally 抛出的异常会被忽略,不影响原始异常
C finally 中 return 与抛异常等价
D 原始异常总是以 cause 形式保存在 finally 异常中
#

10. 基本类型与包装类的差异、自动装箱拆箱的缓存范围与坑点

A Integer/Long 缓存 -128~127,范围内 == 相等、范围外不等,应使用 equals 比较 ✓ 正确答案
B 所有 Integer 值 == 比较都相等
C 自动拆箱永远不会抛 NPE
D 包装类与基本类型性能完全相同
#

11. 基本类型包装类的缓存范围(IntegerCache)在不同 JDK 版本下默认值与可配置边界如何

A 所有包装类缓存范围都可配置
B Integer 缓存默认 -128~127,可用 -XX:AutoBoxCacheMax 提升上限,Long 固定 -128~127 不可配置 ✓ 正确答案
C Integer 缓存范围是 -128~127 且永远不可改
D 缓存范围只影响性能不影响 == 比较
#

12. 字符串拼接 + 与 StringBuilder/StringConcatFactory 的性能边界

A 循环内 str += x 会被编译器优化为高效拼接
B 单条语句多处 + 可被编译优化(StringBuilder/StringConcatFactory),但循环内累积拼接应改用 StringBuilder 避免 O(n²) ✓ 正确答案
C 使用 StringBuilder 永远比 + 慢
D JDK 9 后 + 拼接在循环内也总是 O(n)
#

13. 自定义异常的命名、序列化与栈快照成本

A 异常栈快照总是免费生成的
B 自定义异常必须继承 RuntimeException
C 自定义异常不应有构造器
D 命名以 Exception 结尾、透传 cause、声明 serialVersionUID,热路径可禁用栈快照节省成本 ✓ 正确答案
#

14. 虚拟线程执行的并发子任务分别失败时,调用方应如何聚合异常、传播取消并保留诊断上下文

A 虚拟线程会复用线程池线程,MDC 自动跨子任务继承
B 子任务失败后其他子任务必须继续运行无法取消
C StructuredTaskScope 可统一生命周期、聚合异常并传播取消,诊断上下文需显式传递或复制 ✓ 正确答案
D 虚拟线程无法并发执行多个任务
#

15. 远程调用超时、连接失败和业务拒绝应如何分类,才能制定不同的幂等重试与熔断策略

A 所有异常都应无条件重试
B 业务拒绝也应激进重试以提升成功率
C 熔断只与错误码有关,与重试无关
D 可重试瞬态故障(超时/连接失败)用退避+幂等重试,业务拒绝(4xx)不重试,连续失败触发熔断 ✓ 正确答案
#

16. 频繁调用 Throwable.fillInStackTrace 会带来哪些分配与栈遍历成本,何时可采用无栈异常

A fillInStackTrace 是免费的,无分配
B 无栈异常永远比有栈异常耗时
C 栈快照需遍历栈帧并分配 StackTraceElement,热路径可重写 fillInStackTrace 返回 this 形成无栈异常 ✓ 正确答案
D 无栈异常仍保留完整栈信息
#

17. == 与 equals 在基本类型、引用类型与包装类上的语义差异

A == 对基本类型比值、对引用类型比引用,equals 默认也是引用比较、重写后才是值比较 ✓ 正确答案
B == 对基本类型比较引用,对引用类型才比较值
C equals 用于基本类型比较,因为基本类型也有 equals 方法
D 包装类 == 总是等于值比较,与缓存无关
#

18. @SneakyThrows(Lombok)与隐性异常的代价

A 它把受检异常转成非受检异常,但不会从字节码层面绕过编译器
B 它只影响运行时性能,不影响语义
C 它通过编译期改写绕过受检异常检查,代价是调用方看不到异常契约、异常被隐式传播 ✓ 正确答案
D 它是 JDK 标准注解,与 Lombok 无关
#

19. AssertionError 的使用场景与生产开关

A 断言生产默认开启,适合做参数校验
B assert 抛 AssertionError,生产默认关闭(-da),适合开发期不变量校验而非运行时参数校验 ✓ 正确答案
C assert 失败不会抛任何异常
D AssertionError 是受检异常
#

20. Checked Exception 与 Unchecked Exception 的设计争议

A 受检异常总是优于非受检异常
B 非受检异常也会被编译器强制检查
C 所有异常都应声明为受检
D 受检异常强制处理但常引入样板代码并与 Stream 不兼容,现代实践倾向对调用方无法恢复的场景用非受检异常 ✓ 正确答案
#

21. Error 与 OutOfMemoryError 的处理策略(不可恢复边界)

A OOM 属于不可恢复边界,应保留现场并快速失败退出,由编排层重启,重点是预防 ✓ 正确答案
B OOM 可以安全地捕获后恢复
C StackOverflowError 是必选可恢复的
D Error 与 Exception 处理策略完全相同
#

22. Helpful NPE 在链式调用(a.getB().getC())中的空值定位精度与性能开销

A 它通过分析字节码在链式调用中精确定位哪个环节为 null,开销主要在异常路径、正常路径无影响 ✓ 正确答案
B Helpful NPE 会改变 NPE 的可捕获语义
C Helpful NPE 永远开启且无任何开销
D 它只能定位基本类型空值
#

23. Java 14 Helpful NullPointerException(JEP 358)的空值链定位信息与 -XX:+ShowCodeDetailsInExceptionMessages

A 它报告 NPE 并给出表达式级空值定位,由 -XX:+ShowCodeDetailsInExceptionMessages 控制(JDK 15 起默认开启) ✓ 正确答案
B 它只能报告行号,无法定位链上环节
C 该特性默认关闭且只能手动开启
D 它会吞掉 NPE 不让它抛出
#

24. Java 17 密封接口与 JDK 21 模式匹配的穷尽性检查

A sealed 接口允许任意外部子类
B sealed 用 permits 封闭子类型集,switch 覆盖全部子类型时编译器判定穷尽、遗漏则编译报错 ✓ 正确答案
C default 分支在穷尽 switch 中必须存在
D 穷尽性检查只在运行时进行
#

25. Java 7+ 多 catch(multi-catch)与类型推断

A multi-catch 只支持一个异常类型
B multi-catch 可以捕获有继承关系的异常类型
C multi-catch 变量可以重新赋值
D multi-catch 合并多个不相关异常,变量类型是其共同父类型,且类型间不能有继承关系 ✓ 正确答案
#

26. Java 8 接口默认方法的菱形继承与冲突解决

A 冲突时默认取第一个接口的实现
B 类方法优先于默认方法,无法区分时需显式用 X.super.m() 解决 ✓ 正确答案
C 所有默认方法冲突都会编译失败
D 默认方法不存在冲突问题
#

27. Java 8/11/17/21/25 各版本新增的语言特性对日常编码的影响

A Java 8 引入 record,Java 21 引入 Lambda
B 所有新特性都只在最后一个版本提供
C Java 8 引入 Lambda/Stream,Java 16 定稿 record,Java 21 定稿 switch 模式匹配与 record pattern,Java 25 引入更多新特性 ✓ 正确答案
D 语言特性不影响编码风格
#

28. Java 关键字 yield 在 switch 表达式中的作用

A yield 会退出整个方法
B yield 与 return 完全等价
C yield 用于 switch 表达式块语法分支中返回结果,箭头语法直接用表达式,无需 yield ✓ 正确答案
D yield 只能用于 switch 语句而非表达式
#

29. Java 内部类(成员/局部/匿名/静态内部类)的语义差异

A 所有内部类都不允许访问外部私有成员
B 静态内部类也持有外部实例引用
C 非静态内部类(成员/局部/匿名)隐式持有外部实例引用,静态嵌套类不持有,可独立实例化 ✓ 正确答案
D 匿名内部类不能捕获局部变量
#

30. Java 协变返回类型(Covariant Return Type)

A 子类覆写方法返回类型必须与父类完全相同
B 协变返回类型会降低类型安全
C 协变返回类型只适用于泛型
D 子类覆写时可返回父类返回类型的子类型,编译器用桥接方法兼容字节码签名 ✓ 正确答案
#

31. Java 异常的层次结构(Throwable/Error/Exception/RuntimeException)

A Error 是受检异常,必须处理
B Throwable 的子类只有 Exception
C RuntimeException 及其子类为未受检异常,Error 也是未受检,其余 Exception 为受检异常 ✓ 正确答案
D 所有异常都是受检异常
#

32. Java 数值类型的提升规则与溢出陷阱

A int 溢出会抛 ArithmeticException
B byte+byte 结果仍是 byte
C long 与 int 混合运算结果总是 int
D 数值提升会把 byte/short 提升为 int,int 运算溢出静默回绕,需用 Math.addExact 或 long 运算规避 ✓ 正确答案
#

33. Java 继承与组合的取舍,里氏替换原则的实际违反场景

A 任何继承都合法
B 组合一定比继承差
C LSP 只与接口有关,与继承无关
D 继承代表 is-a,子类须能替换父类(LSP);仅复用代码时用组合,子类破坏父类契约即违反 LSP ✓ 正确答案
#

34. Lambda 中的 checked exception 包装策略

A Lambda 可以直接抛出受检异常
B 标准函数式接口不声明受检异常,需包装成 RuntimeException 或使用自定义 Throwing 函数式接口 ✓ 正确答案
C 受检异常在 Lambda 中会被自动忽略
D 只有 Consumer 能抛受检异常
#

35. _(Underscore)在 Java 8/9 前后的语义变化

A Java 8 和 Java 9 中 _ 都是合法变量名
B Java 8 中 _ 是合法标识符,Java 9 起成为关键字,不能用作标识符 ✓ 正确答案
C _ 在任何版本都不能用
D Java 9 起 _ 可以随意用作类名
#

36. clone() 的浅拷贝、深拷贝与替代方案(拷贝构造器/工厂)

A clone() 需实现 Cloneable 且默认浅拷贝,深拷贝需手动实现,推荐用拷贝构造器/工厂替代 ✓ 正确答案
B clone() 会调用构造器
C clone() 不需要处理异常
D clone() 默认总是深拷贝
#

37. enum 的进阶用法(抽象方法、EnumSet/EnumMap、valueOf 边界)

A EnumMap 用位图实现,EnumSet 用数组实现
B enum 可定义抽象方法让每个常量实现不同行为,EnumSet/EnumMap 用位图/数组高效存储,valueOf 按名称查找 ✓ 正确答案
C valueOf 使用 ordinal 查找
D enum 不能有构造器
#

38. final 字段的安全发布(Safe Publication)保证

A final 字段读到的值可能被重排序影响
B final 字段与 volatile 完全相同
C final 字段保证构造器写入的最终值在其他线程可见且不受重排序影响,但引用本身仍需正确发布 ✓ 正确答案
D final 字段只能继承不能赋值
#

39. instanceof 模式匹配(JEP 394/420)与 switch 模式匹配的演进

A instanceof 模式匹配在 Java 16 定稿,避免强转;switch 模式匹配在 Java 21 定稿,支持类型模式与穷尽性 ✓ 正确答案
B switch 模式匹配在 Java 8 已可用
C 模式匹配只能用于基本类型
D instanceof 模式匹配不能减少强转
#

40. null 对象模式与 Optional 的取舍

A null 对象模式提供空实现让调用安全,Optional 显式表达"可能为空的值"适合返回值链式处理,二者可结合 ✓ 正确答案
B Optional 适合作为字段
C null 对象模式不能实现接口
D 两者完全等价
#

41. 参数校验的快速失败,Objects.requireNonNull/requireNonNullElse 与参数对象自校验(Bean Validation)在异常类型选择上的边界

A 所有校验失败都应抛 NPE
B null 检查用 Objects.requireNonNull(NPE),非法值/约束用 IllegalArgumentException 或 Bean Validation,区分"null"与"非法值" ✓ 正确答案
C Bean Validation 也抛 NPE
D 参数校验不应 fail-fast
#

42. package-info.java 与包级注解的应用

A 它只能声明包名,不能放注解
B 它是普通类
C 它用于声明包级注解与包级文档,注解可作用于整个包(ElementType.PACKAGE) ✓ 正确答案
D 包级注解只能在类上
#

43. super 在泛型与构造中的访问限制

A super(...) 只能出现在构造器最后一行
B super 可以在静态方法中使用
C super(...) 必须出现在构造器第一行,且与关键字 super 相区别,泛型中的 ? super T 是下界通配符 ✓ 正确答案
D super 关键字与泛型 super 通配符是同一概念
#

44. switch 表达式箭头语法(yield)与穷尽性检查(exhaustive switch)在 sealed 接口上的应用

A 箭头语法支持 yield 返回值,sealed 接口的 switch 覆盖全部子类型时视为穷尽、遗漏则编译报错 ✓ 正确答案
B 穷尽 switch 必须带 default
C 穷尽性检查只在运行时进行
D sealed 接口无需穷尽性检查
#

45. try-with-resources 的实现原理与资源关闭顺序

A 资源必须是 Cloneable
B try-with-resources 声明多个资源时按声明顺序关闭
C 多个资源按逆序关闭,close 异常作为 suppressed 附加到主异常,避免覆盖 ✓ 正确答案
D 关闭异常会覆盖主异常
#

46. var 局部变量类型推断的边界(不能用于字段/方法签名)

A var 可用于字段与方法返回类型
B var 可以用于 lambda 参数
C var 是动态类型,运行时才确定
D var 只能用于局部变量,不能用于字段/参数/返回类型,且类型是编译期静态推断 ✓ 正确答案
#

47. 不可变对象的构造策略与防御性拷贝

A 不可变对象可以暴露可变内部引用
B 防御性拷贝会破坏不可变性
C record 一定是深不可变的
D 不可变对象用 final 字段、无 setter,构造和访问时对可变引用做防御性拷贝以隔离外部修改 ✓ 正确答案
#

48. 原始类型、原始类型包装与 Number 子类的关系

A 所有包装类都是 Number 子类
B 数值包装类(Integer/Long 等)继承 Number 提供统一数值转换,Character/Boolean 不是 Number 子类 ✓ 正确答案
C 包装类与原始类型在泛型中可互换使用
D Character 是 Number 子类
#

49. 发生 OutOfMemoryError 后为什么不应依赖常规 catch 恢复,进程退出前可安全执行哪些最小动作

A OOM 后可以继续正常运行
B catch 住 OOM 后清理内存即可恢复
C OOM 不可恢复,不应 catch 恢复,应保留现场(转储/日志)并快速退出由编排层重启,最小动作避免再次分配 ✓ 正确答案
D OOM 只需要在日志中记录即可继续
#

50. 多个 AutoCloseable 资源在业务异常后又关闭失败时,主异常与 suppressed 异常的顺序如何验证

A try 块业务异常是主异常,close 异常通过 getSuppressed() 附加,验证时断言主异常类型与 suppressed 内容 ✓ 正确答案
B close 异常会覆盖业务异常成为主异常
C suppressed 异常无法获取
D 关闭异常总是先于业务异常抛出
#

51. 多态在 Spring 注入(按类型)中的作用与坑点

A 多态支持接口多实现,按类型注入多实现时需用 @Primary/@Qualifier 消歧,或用 List/Map 注入策略集合 ✓ 正确答案
B final 类可以被 CGLIB 代理
C 多实现时按类型注入总是自动选择
D Spring 注入只支持按名称
#

52. 多态的方法调用机制(静态分派与动态分派)

A 重载与重写都是动态分派
B 动态分派只发生在编译期
C 重载是静态分派(编译期按静态类型),重写是动态分派(运行期按实际类型,经虚方法表) ✓ 正确答案
D 静态分派由运行期决定
#

53. 如何保留原始 cause、稳定错误码并避免泄露敏感实现信息

A 异常消息应包含完整堆栈
B 用 cause 保留根因、稳定错误码供外部处理,对外消息脱敏只暴露通用提示,完整栈仅存内部日志 ✓ 正确答案
C 错误码不重要,只需消息
D 对外应暴露堆栈以便调试
#

54. 如何在 Spring 统一异常处理(@ControllerAdvice/HandlerExceptionResolver)中保留 cause

A @ExceptionHandler 无法访问 cause
B 只需记录 getMessage() 即可
C @ExceptionHandler 能拿到原始异常,用日志 API 记录完整异常对象、包装时传入 cause 以保留链 ✓ 正确答案
D cause 会被自动丢弃
#

55. 密封类(sealed class)的 permits 子类控制与模式匹配的穷尽性

A sealed 类允许任意子类
B permits 子类不必直接继承
C sealed 用 permits 封闭子类集,子类须 final/sealed/non-sealed,配合模式匹配穷尽性保证分支完整 ✓ 正确答案
D sealed 与模式匹配无关
#

56. 异常与返回值(Result 对象)的取舍

A 所有错误都应抛异常
B 预期失败用 Result 对象强制处理避免异常开销,真正的异常路径用异常,避免用异常做控制流 ✓ 正确答案
C 异常比 Result 更适合高频业务校验
D Result 对象没有强制处理价值
#

57. 异常信息的国际化与用户友好

A 异常消息直接写死用户文案
B 异常携带稳定错误码与参数,用 MessageSource 按 locale 解析用户文案,技术细节仅存日志 ✓ 正确答案
C 国际化只在服务端日志生效
D 用户应看到完整堆栈
#

58. 异常吞咽(Swallow)与日志记录的常见反模式

A 空 catch、只记消息丢失 cause、只 log 不处理都是反模式,正确做法是记录完整堆栈并决定处理或传播 ✓ 正确答案
B 空 catch 吞异常是安全的
C 记录 e.getMessage() 就足够
D 任何捕获都必须重新抛出
#

59. 异常处理与日志(MDC)的协作

A MDC 自动跨线程继承
B MDC 只在生成日志时使用一次
C MDC 与异常处理无关
D MDC 提供 traceId 等上下文,异常日志自动带上,但需清理并显式传递到异步线程 ✓ 正确答案
#

60. 异常处理中的 finally 块、return 与资源释放

A finally 中 return 是安全的
B finally 只在异常时执行
C 资源释放不保证执行
D finally 中 return 会吞异常、抛异常会覆盖主异常,应优先 try-with-resources 或 finally 内 try/catch 清理 ✓ 正确答案
#

61. 异常指标按类名和错误码聚合时,如何控制标签基数并仍能定位最常见的失败根因

A 指标可直接定位根因无需日志
B 标签基数越高越好
C 订单号应作为指标标签
D 用异常类名+稳定错误码+操作聚合,动态值不进标签,高频失败用指标定位后下钻日志查根因 ✓ 正确答案
#

62. 异常链(Exception Chaining)与 Throwable.getCause() 在多层包装时的调试成本与设计反思

A 包装越多越利于调试
B 多层包装增大栈开销与追溯成本,应只在语义边界包装一次并保留 cause,避免过度嵌套 ✓ 正确答案
C getCause() 无法追溯
D 包装异常不产生任何开销
#

63. 异常链(cause)与 addSuppressed 在 try-with-resources 中的应用

A cause 与 suppressed 是同一概念
B suppressed 异常无法访问
C cause 是纵向根因链,suppressed 是横向被抑制的伴随异常,try-with-resources 用 suppressed 保存关闭异常 ✓ 正确答案
D 关闭异常会覆盖主异常
#

64. 批量处理允许部分成功时,异常模型应如何表达失败项、可重试性与整体提交状态

A 部分成功应直接抛异常
B 失败项无需标记可重试性
C 应用结果对象表达成功项、失败项(含可重试性)与整体状态,避免异常丢失部分成果 ✓ 正确答案
D 整体状态只能由异常决定
#

65. 抽象类与接口在服务实现上的选择准则(Spring 实践)

A 抽象类可以多继承
B 接口用于共享实现,抽象类用于契约
C 接口用于契约与多实现,抽象类用于共享实现/模板,Spring 面向接口便于代理与测试 ✓ 正确答案
D 接口不能提供默认实现
#

66. 抽象类与接口的差异、Java 8 默认方法的多继承冲突

A 接口可以有实例字段
B 接口只能单继承
C 抽象类有状态/构造器/模板,接口多实现;默认方法冲突用"类优先+显式 X.super.m()"解决 ✓ 正确答案
D 默认方法冲突自动选择
#

67. 抽象静态方法为何不允许

A 静态方法可以抽象
B 抽象静态方法可被覆写
C 静态方法类级绑定、不参与多态,无法被覆写,故抽象静态方法无意义不被允许 ✓ 正确答案
D 接口允许抽象静态方法
#

68. 捕获 InterruptedException 后为什么通常需要恢复中断标记,忽略它会破坏哪些取消协议

A 捕获 InterruptedException 后无需恢复标记
B 中断标记无法恢复
C 中断只能由线程池处理
D 阻塞方法抛异常会清除中断标记,恢复标记(interrupt())才能把取消意图传给上层,否则破坏协作取消协议 ✓ 正确答案
#

69. 接口中的 private 方法(Java 9+)与默认方法的协作

A 接口 private 方法可被外部调用
B 接口 private 方法(Java 9+)抽取默认方法间共享逻辑,只能在接口内部使用,不参与覆写 ✓ 正确答案
C 接口 private 方法必须是 abstract
D 接口 private 方法可被实现类覆写
#

70. 接口常量、枚举常量与 final 字段的使用边界

A 有界值集合用 enum(类型安全),通用常量用 final 字段,避免在接口中定义常量 ✓ 正确答案
B 接口常量是推荐做法
C enum 常量不能类型安全
D 接口常量不会污染命名空间
#

71. 文本块(Text Block,Java 13+)的缩进与转义规则

A 文本块不处理缩进
B 文本块用三引号包裹,自动去除共同缩进,\s 表示显式空格,适合多行 SQL/JSON ✓ 正确答案
C 文本块不能包含换行
D 文本块是运行期对象非编译期常量
#

72. 构造器链、this() 与 super() 的执行顺序

A this() 与 super() 可以同时出现在第一行
B 子类构造器总是先于父类执行
C 构造器可省略 super() 不调用父类
D this()/super() 必须第一行,父类构造器先于子类执行,this 委托后执行当前构造器剩余部分 ✓ 正确答案
#

73. 注解(Annotation)在 JDK 8 起的类型注解(Type Annotation)

A 类型注解只能在字段上
B 类型注解只能作用于类声明
C 类型注解与普通注解无关
D 类型注解(@Target(TYPE_USE))可作用于类型出现的任意位置(泛型参数、转换、new),用于空值检查等 ✓ 正确答案
#

74. 浮点精度与 BigDecimal 在金融计算中 scale 与舍入模式(RoundingMode)的取舍策略有哪些

A 统一 scale 与 RoundingMode,用 String 构造避免误差,compareTo 比较忽略 scale,除法需显式指定 scale ✓ 正确答案
B 用 double 构造 BigDecimal 更精确
C equals 适合比较金额
D 舍入模式选择不影响结果
#

75. 浮点精度与 BigDecimal 的正确使用(构造、scale、等值比较)

A new BigDecimal(0.1) 精确
B 用 String 构造避免 double 误差,比较用 compareTo(忽略 scale)而非 equals(要求 scale 相同) ✓ 正确答案
C equals 与 compareTo 等价
D 除法无需指定 scale
#

76. 继承层级过深的实际危害与重构方法

A 深继承耦合高、破坏封装,用组合/接口/策略重构,保持层级扁平 ✓ 正确答案
B 深继承不影响基类
C 组合比继承更难维护
D 继承越深越利于复用
#

77. 自定义异常跨模块公开时,如何设计构造器、错误码和序列化边界以保持版本兼容

A 稳定错误码、向后兼容构造器、显式 serialVersionUID 与谨慎字段增删以保持版本兼容 ✓ 正确答案
B 错误码可随版本随意修改
C serialVersionUID 不需要声明
D 构造器可随意删除
#

78. 记录类(record)与普通类的差异,哪些场景不应使用

A record 可变且可继承
B record 不自动生成 equals
C record 可被继承
D record 是不可变数据载体,自动生成值语义方法;需要可变、继承、复杂行为时用普通类 ✓ 正确答案
#

79. 访问修饰符(public/protected/package-private/private)

A 访问范围 public > protected > package-private > private,protected 允许同包与跨包子类访问 ✓ 正确答案
B protected 与 package-private 完全等价
C private 成员可被同包访问
D package-private 跨包可见
#

80. JDK 21 弃用、Windows 32 位移除与未来删除 API 的应对策略

A 应跟踪弃用警告、制定升级计划、核对依赖与平台(如 Windows 32 位)支持,及时迁移 ✓ 正确答案
B 弃用 API 可放心长期使用
C Windows 32 位永远受支持
D 弃用 API 永远不会被移除
#

81. JDK 25 中 try 语句对结构化并发(Structured Concurrency)抛出的取消异常传播机制如何处理

A 取消异常不传播
B 子任务取消不会影响 scope
C StructuredTaskScope 的 join() 汇总子任务异常/取消并传播,try-with-resources 保证 scope 关闭 ✓ 正确答案
D 结构化并发与传统并发无差别
#

82. switch 对 String 的匹配是如何编译实现的(hashCode 比较后 equals 确认),与整数 switch 的 tableswitch/lookupswitch 有何差异

A String switch 用 equals 逐一比较所有 case
B String switch 允许 null
C 整数 switch 也用 hashCode
D String switch 编译为 hashCode 定位 + equals 确认,整数 switch 用 tableswitch/lookupswitch 直接跳转 ✓ 正确答案
#

83. 匿名内部类与 Lambda 在 this 指向、变量捕获与字节码生成上的差异

A Lambda 中 this 指向外层类,匿名内部类 this 指向自身;Lambda 用 invokedynamic 轻量生成,匿名类有独立 class 文件 ✓ 正确答案
B Lambda 有独立 class 文件
C 两者 this 都指向内部类
D 两者字节码完全相同
#

84. JDK-8213077(异常忽略 umbrella bug)的成因与防御性异常处理启示

A 异常忽略掩盖 bug,应记录完整堆栈、保留 cause、明确忽略理由并用静态检查防御 ✓ 正确答案
B 只记录 e.getMessage() 足够
C 异常忽略有利于性能
D 空 catch 是安全的
#

85. Java 24/25 中 JEP 495(第 4 次预览)到 JEP 512(终版)的“更简洁源文件与实例 main”演进边界

A 实例 main 必须 static
B JEP 512 在 JDK 24 预览
C JEP 495 第 4 次预览、JEP 512 在 JDK 25 终版,允许未命名类与实例 main 简化样板 ✓ 正确答案
D JEP 512 移除了 main 方法
#

86. Java 中值类(Value Class)提案(Project Valhalla / JEP 401 方向)

A 值类有对象身份
B 值类(Project Valhalla/JEP 401)无身份、按值语义扁平化存储,减少内存与 GC 开销 ✓ 正确答案
C 值类可与普通类相同使用 synchronized
D 值类只影响语法不影响性能
#

87. JDK 25 引入的 JEP 513 灵活构造函数体(终版,前身为 JDK 23/24 的 JEP 482/492 预览)对异常传播路径的影响是什么

A super() 必须永远是第一行
B 该特性功能是移除 super()
C super 前语句可访问 this 字段
D JEP 513 允许 super()/this() 前执行语句(如参数校验),异常可在父类构造前抛出、传播路径更早 ✓ 正确答案
#

88. JEP 511 Module Import Declarations 在 JDK 25 对源文件头部 import 模块的影响

A 模块导入只影响运行时
B import module 批量导入模块导出的所有包以简化头部 import,命名冲突时需显式 import,是编译期特性 ✓ 正确答案
C 模块导入会改变模块图
D 模块导入替代所有 import
#

89. JEP 513 Flexible Constructor Bodies 在 JDK 25 允许构造函数中语句先于 this()/super() 的边界

A super 前可执行不依赖 this/父类状态的语句,但不能访问 this/父类成员,且必须保证 super 恰好调用一次 ✓ 正确答案
B super 前可访问 this 字段
C super 前可任意调用实例方法
D super 可放在 finally 中
#

90. Java 9 引入的字符串紧凑字符串(Compact Strings)

A Compact Strings 用 char[] 存储
B Compact Strings 用 byte[] + coder,LATIN-1 字符 1 字节/字符省内存,非 ASCII 用 UTF-16,API 语义不变 ✓ 正确答案
C Compact Strings 改变了字符串 API 语义
D Compact Strings 只影响中文
#

91. Java 中 strictfp 的历史与现状

A strictfp 强制 IEEE 754 严格浮点,JDK 17 起默认即严格(JEP 306),strictfp 成为无操作保留 ✓ 正确答案
B strictfp 会降低精度
C strictfp 只在 JDK 17 后可用
D strictfp 用于整数运算
#

92. Java 模式匹配的 instanceof、模式变量与 switch 表达式在 JDK 25 中的作用域规则有何更新

A 模式变量在任意分支都可用
B 模式变量可在未匹配路径使用
C 模式变量作用域由流经分析决定,instanceof 匹配成功与否决定可用,switch 中在 case 内可用,JDK 25 细化规则 ✓ 正确答案
D 模式变量作用域无规则
#

93. Object 通用方法(equals/hashCode/toString/clone/finalize/getClass/wait/notify)的正确重写

A equals 需满足契约且与 hashCode 一致,toString 提供可读表示,finalize 已废弃,wait/notify 是监视器原语 ✓ 正确答案
B equals 与 hashCode 无需一致
C getClass 可重写
D finalize 是推荐清理方式
#

94. final、finally、finalize 三者的本质差异

A 三者本质相同
B final 是修饰符、finally 是异常处理块、finalize 是已废弃的生命周期方法,三者本质无关 ✓ 正确答案
C finalize 比 try-with-resources 更可靠
D finally 可以修饰类
#

95. switch 的 fall-through 历史陷阱与箭头语法(->)的 break 语义差异

A 传统 switch 若无 break 不会 fall-through
B 箭头语法也需 break
C 箭头语法总需要 default
D 传统 switch 缺 break 会 fall-through 连锁执行,箭头语法(->)自动终止无需 break ✓ 正确答案
#

96. try-with-resources 在 JDK 25 中对 Scoped Values 与清理钩子的支持边界

A Scoped Values 是可变全局变量
B Scoped Values 跨线程自由设置
C Scoped Values 与 ThreadLocal 完全相同
D Scoped Values 用 try-with-resources 定义不可变值的作用域,结束自动清理,是 ThreadLocal 的安全替代 ✓ 正确答案
#

97. var 局部类型推断在 JDK 25/26 中对涉及记录类与密封类的复杂泛型推断边界如何演化

A var 是动态类型
B var 从初始化器静态类型推断,record/密封类场景下推断更精确,但不改变静态类型语义 ✓ 正确答案
C var 会因密封类收窄为具体子类
D var 无法用于 record
#

98. 异常性能基准测试的常见误区

A 异常总是极慢
B 异常创建没有成本
C try/catch 本身一定昂贵
D 误区包括未预热 JIT、未区分异常创建与传播、忽略栈深与 GC,应用 JMH 预热并控制变量 ✓ 正确答案
#

99. record 的紧凑构造器(Compact Constructor)与规范构造器在参数校验与防御性拷贝上的分工

A 紧凑构造器不执行参数校验
B 紧凑构造器必须显式赋值
C 紧凑构造器是规范构造器简写,在体内做参数校验与防御性拷贝后隐式赋值,反序列化不走构造器 ✓ 正确答案
D 紧凑构造器与规范构造器无关