1 /* @test /nodynamiccopyright/ 2 * @bug 7196163 3 * @summary Verify that variables can be used as operands to try-with-resources 4 * @compile/fail/ref=TwrForVariable1.out -source 8 -XDrawDiagnostics -Xlint:-options TwrForVariable1.java 5 * @compile TwrForVariable1.java 6 * @run main TwrForVariable1 7 */ 8 public class TwrForVariable1 implements AutoCloseable { 9 private static int closeCount = 0; 10 public static void main(String... args) { 11 TwrForVariable1 v = new TwrForVariable1(); 12 13 try (v) { 14 assertCloseCount(0); 15 } 16 try (/**@deprecated*/v) { 17 assertCloseCount(1); 18 } 19 try (v.finalWrapper.finalField) { 20 assertCloseCount(2); 21 } catch (Exception ex) { 22 } 23 try (new TwrForVariable1() { }.finalWrapper.finalField) { 24 assertCloseCount(3); 25 } catch (Exception ex) { 26 } 27 try ((args.length > 0 ? v : new TwrForVariable1()).finalWrapper.finalField) { 28 assertCloseCount(4); 29 } catch (Exception ex) { 30 } 31 try { 32 throw new CloseableException(); 33 } catch (CloseableException ex) { 34 try (ex) { 35 assertCloseCount(5); 36 } 37 } 38 39 assertCloseCount(6); 40 } 41 42 static void assertCloseCount(int expectedCloseCount) { 43 if (closeCount != expectedCloseCount) 44 throw new RuntimeException("bad closeCount: " + closeCount + 45 "; expected: " + expectedCloseCount); 46 } 47 48 public void close() { 49 closeCount++; 50 } 51 52 final FinalWrapper finalWrapper = new FinalWrapper(); 53 54 static class FinalWrapper { 55 public final AutoCloseable finalField = new AutoCloseable() { 56 @Override 57 public void close() throws Exception { 58 closeCount++; 59 } 60 }; 61 } 62 63 static class CloseableException extends Exception implements AutoCloseable { 64 @Override 65 public void close() { 66 closeCount++; 67 } 68 } 69 }