Java中try-with-resources必须用AutoCloseable接口,因仅其实现类才能被自动调用close();自定义类需实现它并妥善处理重复关闭、null检查及异常类型;捕获IOException比Exception更精准,避免掩盖逻辑错误。
Java中try-with-resources为什么必须用AutoCloseable
因为只有实现了AutoCloseable接口的类,才能被try语句自动调用close()方法。像FileInputStream、BufferedReader这些标准IO类都实现了它;但如果你自己写的工具类没实现这个接口,放进try-with-resources里会编译报错:Cannot use this type in a try-with-resources statement。
实操建议:
- 自定义资源类时,务必继承
AutoCloseable并重写close(),且内部要处理好重复关闭和null检查 - 不要在
close()里抛出非IOException的受检异常——否则会被编译器拒绝 - 如果资源初始化失败(比如构造函数抛
IOException),try块还没进入,自然也不会触发close()
捕获IOException还是Exception更合适
直接捕获IOException更精准。Java IO体系里,所有底层读写失败(文件不存在、磁盘满、网络中断等)都归为此类;而笼统抓Exception会掩盖逻辑错误,比如把NullPointerException也吞掉,反而难定位问题。
常见误用场景:
立即学习“Java免费学习笔记(深入)”;