Search code examples
javainstrumentationjava-7clovertry-with-resources

Compilation fails after Clover instrumentation of Java 7 try-with-resources


I am using a simple try-with-resources statement like the following:

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

It compiles fine using a normal javac Ant task, but when I have Clover instrument the code first, the resultant code no longer compiles (see the compilation message included below).

According to the docs, this version of Clover does support Java 7. Has anyone else run across this issue or have any idea what the problem is?

Java version:

java version "1.7.0"
Java(TM) SE Runtime Environment (build pxi3270-20110827_01)
IBM J9 VM (build 2.6, JRE 1.7.0 Linux x86-32 20110810_88604 (JIT enabled, AOT enabled)
J9VM - R26_Java726_GA_20110810_1208_B88592
JIT  - r11_20110810_20466
GC   - R26_Java726_GA_20110810_1208_B88592
J9CL - 20110810_88604)
JCL - 20110809_01 based on Oracle 7b147

Output of Ant task:

compile:
     [echo] Compiling source code...
    [javac] Compiling 135 source files to /home/*********/WEB-INF/classes
   [clover] Clover Version 3.1.2, built on November 07 2011 (build-842)
   [clover] Loaded from: /home/*******/clover.jar
   [clover] Clover: Commercial License registered to *******.
   [clover] Updating existing database at '/home/********/dist/clover/clover.db'.
   [clover] Processing files at 1.7 source level.
   [clover] Clover all over. Instrumented 135 files (12 packages).
   [clover] Elapsed time = 1.597 secs. (84.534 files/sec, 12,463.369 srclines/sec)
    [javac] /tmp/clover2218935617827048125.tmp/com/****/web/DownloadService.java:232: error: illegal start of type
    [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"));){

Solution

  • It seems that using optional trailing semicolon to terminate resources list in try-with-resources is not allowed with your JDK version, it's illegal under JSR 334.

    Check this documentation :

    SYNTAX: The existing set of grammar productions for TryStatement in JLS §14.20 is augmented with:

    TryStatement:
        try ResourceSpecification Block Catchesopt Finallyopt 
    
    Supporting new grammar productions are added:
    
    ResourceSpecification:
        ( Resources ) 
    Resources:
        Resource 
        Resource ; Resources 
    Resource:
        VariableModifiers Type VariableDeclaratorId = Expression 
        Expression 
    

    [An implication of the combined grammar is that a try statement must have at least one of a catch clause, a finally block, and a resource specification. Furthermore, it is permissible for a try statement to have exactly one of these three components. Note that it is illegal to have a trailing semi-colon in the resource specification.]

    Try to drop the last semicolon :

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