aoqi@0: /* aoqi@0: * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: /* aoqi@0: * @test aoqi@0: * @bug 8025113 aoqi@0: * @author sogoel aoqi@0: * @summary t-w-r completes abruptly if the initialization of resource completes abruptly aoqi@0: */ aoqi@0: aoqi@0: import java.io.FileInputStream; aoqi@0: import java.io.IOException; aoqi@0: import java.io.File; aoqi@0: aoqi@0: /* aoqi@0: * If the initialization of the resource completes abruptly because of a aoqi@0: * throw of a value V ... and the automatic ->closing of the resource completes normally, aoqi@0: * then the try-with-resources statement completes abruptly because of the throw of value V. aoqi@0: */ aoqi@0: public class TestTwr09 { aoqi@0: aoqi@0: /** aoqi@0: * throw from ctor of nested resource aoqi@0: * Check first resource is not open. aoqi@0: */ aoqi@0: String test1() { aoqi@0: String ret = null; aoqi@0: try (ResCloseable tr = new ResCloseable(new ResCloseable("throw from inner resource ctor",3))) { aoqi@0: ret = "FAIL"; aoqi@0: } catch (RuntimeException re) { aoqi@0: ret = re.getMessage(); aoqi@0: } aoqi@0: return ret; aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * throw from ctor of 2nd resource. aoqi@0: * 1st resource, FileInputStream should be automatically closed. aoqi@0: */ aoqi@0: String test2() { aoqi@0: String ret = null; aoqi@0: byte[] buf = new byte[1]; aoqi@0: try (java.io.ByteArrayInputStream tr = new java.io.ByteArrayInputStream(buf); aoqi@0: ResCloseable str = new ResCloseable("throw from inner resource ctor",3)) { aoqi@0: ret = "FAIL"; aoqi@0: } catch (final IOException fe) { aoqi@0: ret = "FAIL test2"; aoqi@0: } catch (RuntimeException re) { aoqi@0: ret = "PASS test2"; aoqi@0: } aoqi@0: System.out.println("Ret = " + ret); aoqi@0: return ret; aoqi@0: } aoqi@0: aoqi@0: public static void main(String... args) { aoqi@0: TestTwr09 t = new TestTwr09(); aoqi@0: if (t.test1().compareTo("throw from inner resource ctor") != 0) { aoqi@0: throw new RuntimeException("FAIL-test1"); aoqi@0: } aoqi@0: if (t.test2().compareTo("PASS test2") != 0) { aoqi@0: throw new RuntimeException("FAIL-test2"); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: /** a simple resource the implements AutoCloseable so it can be used aoqi@0: * in twr's resource specification block. aoqi@0: */ aoqi@0: class ResCloseable implements AutoCloseable { aoqi@0: aoqi@0: ResCloseable testres = null; aoqi@0: String msg = "default"; aoqi@0: boolean bOpen = false; aoqi@0: aoqi@0: public ResCloseable() { aoqi@0: bOpen = true; aoqi@0: } aoqi@0: aoqi@0: public ResCloseable(ResCloseable tr) { aoqi@0: bOpen = true; aoqi@0: msg = tr.getMsg(); aoqi@0: } aoqi@0: aoqi@0: public ResCloseable(String s) { aoqi@0: bOpen = true; aoqi@0: msg = s; aoqi@0: } aoqi@0: aoqi@0: public ResCloseable(String msg, int c) { aoqi@0: bOpen = true; aoqi@0: if (c == 3) { aoqi@0: throw new RuntimeException(msg); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: @Override aoqi@0: public void close() { aoqi@0: bOpen = false; aoqi@0: } aoqi@0: aoqi@0: public boolean isOpen() { aoqi@0: return bOpen; aoqi@0: } aoqi@0: aoqi@0: public String getMsg() { aoqi@0: return msg; aoqi@0: } aoqi@0: } aoqi@0: