-
本文详解为何@ControllerAdvice无法捕获自定义ApiException,重点指出包扫描范围缺失这一常见原因,并提供完整、可落地的配置方案与最佳实践。
-
答案:通过Java文件操作与集合管理实现音乐播放列表,首先使用File类遍历指定目录并筛选.mp3文件,获取绝对路径;接着将路径存入ArrayList或LinkedList集合,便于动态增删、随机播放及索引访问;可封装Playlist类管理播放状态;结合JavaFX的MediaPlayer实现简易播放功能;整个过程涵盖路径处理、文件筛选、集合操作等核心技能,并建议用Paths.get()提升跨平台兼容性。
-
使用同步集合需手动加锁遍历,推荐并发集合如CopyOnWriteArrayList避免异常,迭代删除用Iterator.remove(),或用Stream生成新集合以确保线程安全。
-
程序计数器是JVM中线程私有、无OutOfMemoryError的区域,用于记录当前线程执行的字节码指令地址,支持多线程独立运行,调试时辅助定位执行位置。
-
Vector是线程安全的遗留类,所有public方法加synchronized;ArrayList非线程安全,需手动同步;Vector扩容默认×2且支持自定义增量,ArrayList扩容×1.5;单线程下ArrayList性能更优。
-
Java通过try-catch-finally和throws实现异常处理,保障程序健壮性;try捕获异常,catch处理特定异常,finally执行清理操作,throws声明未处理异常。
-
Java中用户操作偏好持久化需按场景选择策略:桌面端用PreferencesAPI,Web端用Session+数据库,结构化存储推荐JSON或Properties,并注意生命周期管理与默认值兜底。
-
CyclicBarrier是可重复使用的线程同步工具,用于让多个线程互相等待至公共屏障点再继续执行;创建时指定线程数量,所有线程调用await()后触发释放,支持屏障动作、超时机制与异常处理,适用于多线程协作计算、并行任务汇总等场景。
-
静态变量属于类,被所有实例共享,类加载时分配内存,存储于方法区,可通过类名访问,生命周期随程序结束而终止;实例变量属于对象,每个对象独立拥有,创建时分配在堆内存,只能通过对象访问,生命周期与对象一致。
-
单线程用StringBuilder,多线程用StringBuffer——必须根据线程环境选择:前者无锁高效,后者同步安全;误用会导致数据错乱或性能浪费。
-
Java继承需注意:1.仅支持单继承,多行为通过接口实现;2.构造器不被继承,子类须显式调用父类构造器且super()在首行;3.成员访问受private、protected、包私有控制;4.重写方法需同名同参,返回类型兼容,访问权限不stricter,异常不增多,建议用@Override;5.父类构造器中避免调用可重写方法,防止未初始化问题;6.final类不可继承,final方法不可重写,慎用以防限制扩展;7.继承可能破坏封装,优先组合代替继承,确保符合is-a和里氏替换原则。
-
守护线程是为其他线程服务的后台线程,如垃圾回收、监控等,其生命周期依赖于用户线程;1.通过setDaemon(true)设置,需在线程启动前调用;2.JVM在所有用户线程结束后即终止,无论守护线程是否仍在运行;3.适用于可中断的辅助任务,如日志记录、缓存清理,但不应处理关键业务或资源释放;4.典型例子包括JVM的GC线程和心跳检测线程;5.守护线程随主线程生灭,用以提升效率,但需确保任务非核心且可被强制终止。
-
答案:Java中可通过Timer和TimerTask实现计时器,示例代码展示每秒累加并输出时间,5秒后停止;也可实现倒计时功能,注意事项包括Timer为单线程、建议用ScheduledExecutorService替代及及时调用cancel防止泄漏。
-
答案是使用Collections.reverse()可反转List集合元素顺序,如ArrayList、LinkedList等,该方法原地修改列表且无返回值,仅适用于有序集合类型。
-
使用Collections.emptyList()和emptySet()可节省内存、保证线程安全、提升泛型安全与代码可读性,适用于默认返回值等不可变场景。