Java 8结合try-with-resource的FileOutputStream编译报错求助
解决Eclipse中try-with-resources的编译报错问题
这个问题的根源很明确:try-with-resources是Java 7才新增的语法特性,如果你的项目当前的编译合规级别(source level)低于1.7,编译器自然不支持这个写法,也就会抛出你看到的"Resource specification not allowed here for source level below 1.7"错误。Eclipse提示的修复方向完全正确,下面给你详细的操作步骤,以及兼容低版本JDK的备选写法。
方案一:升级项目的编译级别和JRE到1.7及以上
按照以下步骤在Eclipse中完成配置:
- 右键你的项目,选择「Properties」(属性)
- 在左侧导航栏找到「Java Compiler」,勾选「Enable project specific settings」(如果未勾选)
- 将「Compiler compliance level」下拉选项改为1.7或更高版本(推荐选择1.8、11这类更常用的LTS版本)
- 切换到「Java Build Path」标签页,找到「Libraries」列表里的「JRE System Library」,如果它的版本低于1.7:
- 点击「Edit」,选择「Installed JREs」中已配置的1.7+版本JRE,或者点击「Add」添加对应的JRE
- 点击「Apply」再点击「OK」,重新编译项目就能解决报错
方案二:使用传统try-catch-finally关闭资源(兼容Java 6及以下)
如果暂时无法升级JDK版本,你可以改用传统的资源关闭方式,手动在finally块中关闭流:
public static void main(String[] args) { Employee employeeOut = null; FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream("Employee.ser"); oos = new ObjectOutputStream(fos); // 在这里添加你的序列化逻辑,比如: // oos.writeObject(employeeOut); } catch (IOException e) { // 处理IO异常 e.printStackTrace(); } finally { // 手动关闭资源,注意顺序(先关上层流,再关底层流) try { if (oos != null) { oos.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Avdhut




