java 9起支持直接引用外部已声明且effectively final的资源变量,而java 7–8必须在try()内重新声明并初始化;变量需预先初始化且未被重新赋值,编译需jdk 9+及对应语言级别配置。

Java 9 之前不支持直接传入已声明的变量,必须在 try() 括号内重新声明并初始化;Java 9 起允许直接引用外部已声明、且为 effectively final(实际未被重新赋值)的变量。
Java 7–8:必须在 try() 内部声明资源
变量不能复用外部声明,哪怕它是 final 或只赋值一次,也必须在括号中“再写一遍”:
try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) { ... }- 若先写
BufferedReader br = ...;,再写try(br)→ 编译报错 - 想复用已声明变量,只能绕道:如
try(BufferedReader r = br),但这是新变量,非直接引用原变量
Java 9+:支持直接使用外部已声明的 effectively final 变量
只要变量满足两个条件,就能直接传入 try():
- 已在 try 前完成初始化(不能是 null 或未初始化状态)
- 后续未被重新赋值(即引用不变,符合 effectively final)
例如:
✔ 正确写法(Java 9+)BufferedReader br = new BufferedReader(new FileReader("a.txt"));<br>try (br) {<br> String line = br.readLine();<br>}
→ 不报错,
br.close() 自动调用
如何确认变量是否为 effectively final?
不需要加 final 关键字,但需确保:
- 声明后仅赋值一次(如
BufferedReader br = ...;) - 之后没出现
br = ...;或br = null;这类重赋值语句 - 即使在 try 块内或 catch 中也不可修改该引用
配置要点:版本与编译器设置
语法生效取决于 JDK 版本和编译目标版本:
- 项目需使用 JDK 9 或更高版本构建(JDK 8 编译器会拒绝
try(br)写法) - Maven 中需指定
<source>9</source>和<target>9</target>(或更高) - IDE(如 IntelliJ / Eclipse)需将项目语言级别设为 9+,否则编辑器会标红提示
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











