try-with-resources(Java 7)让在 try(...) 中声明的、实现了 AutoCloseable 的资源在块结束时自动调用 close(),无论正常结束还是抛异常,省去手写 finally 关流的样板。它是编译器语法糖:字节码里展开成 try-catch-finally 结构,资源的关闭顺序与声明顺序相反(后声明先关闭)。

异常抑制(suppressed exception):当 try 块抛出一个异常,而 close() 时又抛出另一个异常,直接覆盖会丢失现场。try-with-resources 把 close() 抛出的异常通过 Throwable.addSuppressed() 挂到主异常上,printStackTrace 时以 "Suppressed: ..." 展示,主异常仍是业务异常——这是比手写 finally(close 异常会覆盖原始异常)更安全的语义。实践要点:能自动关就别手写 finally;JDBC 时代要在 finally 里分别关 ResultSet/Statement/Connection 的代码,现在一个 try 声明三个资源即可。追问方向:AutoCloseable 与 Closeable 的区别(前者 close 抛 Exception、后者抛 IOException 且可重复调用)、Java 9 允许对 effectively final 的已存在变量直接使用该语法。

(约 400 字)