在 Java 7 try-with-resources 的 Clover 检测后编译失败

Posted

技术标签:

【中文标题】在 Java 7 try-with-resources 的 Clover 检测后编译失败【英文标题】:Compilation fails after Clover instrumentation of Java 7 try-with-resources 【发布时间】:2011-12-27 23:10:55 【问题描述】:

我正在使用一个简单的 try-with-resources 语句,如下所示:

try (final CSVWriter w = new CSVWriter(new OutputStreamWriter(r.getOutputStream(), "UTF-8"));)
    //do stuff......

使用普通的javac Ant 任务可以正常编译,但是当我首先使用 Clover 检测代码时,生成的代码不再编译(请参阅下面包含的编译消息)。

According to the docs,这个版本的 Clover 确实支持 Java 7。有没有其他人遇到过这个问题或者知道问题出在哪里?

Java 版本:

java版本“1.7.0” Java(TM) SE 运行时环境(构建 pxi3270-20110827_01) IBM J9 VM(内部版本 2.6,JRE 1.7.0 Linux x86-32 20110810_88604(启用 JIT,启用 AOT) J9VM - R26_Java726_GA_20110810_1208_B88592 JIT - r11_20110810_20466 GC-R26_Java726_GA_20110810_1208_B88592 J9CL-20110810_88604) JCL - 20110809_01 基于 Oracle 7b147

Ant 任务的输出:

编译: [echo] 正在编译源代码... [javac] 编译135个源文件到/home/*********/WEB-INF/classes [clover] Clover 版本 3.1.2,建于 2011 年 11 月 7 日(build-842) [clover] 加载自:/home/*******/clover.jar [clover] Clover:商业许可证注册到*******。 [clover] 更新 '/home/********/dist/clover/clover.db' 中的现有数据库。 [clover] 在 1.7 源代码级别处理文件。 [三叶草] 四叶草遍地。检测了 135 个文件(12 个包)。 [三叶草] 经过时间 = 1.597 秒。 (84.534 文件/秒,12,463.369 srclines/秒) [javac] /tmp/clover2218935617827048125.tmp/com/****/web/DownloadService.java:232:错误:类型的非法开始 [javac] __CLR3_1_24ae4aegwpi0zhh.R.inc(5592);try (new java.lang.AutoCloseable() __CLR3_1_24ae4aegwpi0zhh.R.inc(5593);public void close();CSVWriter w = new CSVWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8"));)

【问题讨论】:

【参考方案1】:

您的JDK版本似乎不允许using optional trailing semicolon to terminate resources list in try-with-resourcesit's illegal under JSR 334

检查这个documentation:

语法:JLS §14.20 中 TryStatement 的现有语法产生式集增加了:

TryStatement:
    try ResourceSpecification Block Catchesopt Finallyopt 

Supporting new grammar productions are added:

ResourceSpecification:
    ( Resources ) 
Resources:
    Resource 
    Resource ; Resources 
Resource:
    VariableModifiers Type VariableDeclaratorId = Expression 
    Expression 

[组合语法的一个含义是 try 语句必须至少具有 catch 子句、finally 块和资源规范之一。此外,try 语句允许恰好具有这三个组件之一。 请注意,在资源规范中尾随分号是非法的。]

尽量去掉最后一个分号:

try (final CSVWriter w = new CSVWriter(new OutputStreamWriter(r.getOutputStream(), "UTF-8")))
//do stuff......

【讨论】:

以上是关于在 Java 7 try-with-resources 的 Clover 检测后编译失败的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 7 try-with-resources 的 Clover 检测后编译失败

java 逐行阅读文本文件:Java 7,try-with-resources

Java 7 新的 try-with-resources 语句,自动资源释放

java 逐行读取文本文件:Java 7,try-with-resources,没有行泄漏

java 7 try-with-resource 语法错误

了解 JDK 7 - try-with-resources