blob: 251c0daeebde1f8b5caca53a6e8f9b2e525d3d9e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Stephan Herrmann - Contributions for
* bug 358827 - [1.7] exception analysis for t-w-r spoils null analysis
* bug 349326 - [1.7] new warning for missing try-with-resources
* bug 359334 - Analysis for resource leak warnings does not consider exceptions as method exit points
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
import java.util.Map;
import junit.framework.Test;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
public class TryWithResourcesStatementTest extends AbstractRegressionTest {
static {
// TESTS_NAMES = new String[] { "test061m"};
// TESTS_NUMBERS = new int[] { 50 };
// TESTS_RANGE = new int[] { 11, -1 };
}
public TryWithResourcesStatementTest(String name) {
super(name);
}
public static Test suite() {
return buildMinimalComplianceTestSuite(testClass(), F_1_7);
}
// Test resource type related errors
public void test001() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (int i = 0) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (int i = 0) {\n" +
" ^^^\n" +
"The resource type int does not implement java.lang.AutoCloseable\n" +
"----------\n");
}
// Test resource type related errors
public void test002() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (int[] tab = {}) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (int[] tab = {}) {\n" +
" ^^^^^\n" +
"The resource type int[] does not implement java.lang.AutoCloseable\n" +
"----------\n");
}
// Test that resource type could be interface type.
public void test003() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X implements AutoCloseable{\n" +
" public void method1(){\n" +
" try (AutoCloseable a = new X()) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 1)\n" +
" public class X implements AutoCloseable{\n" +
" ^\n" +
"The type X must implement the inherited abstract method AutoCloseable.close()\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" try (AutoCloseable a = new X()) {\n" +
" ^\n" +
"Unhandled exception type Exception thrown by automatic close() invocation on a\n" +
"----------\n");
}
// Type resource type related errors
public void test003a() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y y = new Y()) { \n" +
" System.out.println();\n" +
" } catch (Exception e) {\n" +
" } finally {\n" +
" Zork z;\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements Managed {\n" +
" public void close () throws Exception {\n" +
" }\n" +
"}\n" +
"interface Managed extends AutoCloseable {}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
// Scope, visibility related tests.
public void test004() {
this.runNegativeTest(
new String[] {
"X.java",
"import java.io.*;\n" +
"public class X {\n" +
" public static void main(String[] args) throws IOException {\n" +
" int i = 0;\n" +
" try (LineNumberReader reader = new LineNumberReader(new BufferedReader(new FileReader(args[0])))) {\n" +
" String s;\n" +
" int i = 0;\n" +
" while ((s = reader.readLine()) != null) {\n" +
" System.out.println(s);\n" +
" i++;\n" +
" }\n" +
" System.out.println(\"\" + i + \" lines\");\n" +
" }\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" int i = 0;\n" +
" ^\n" +
"Duplicate local variable i\n" +
"----------\n");
}
//Scope, visibility related tests.
public void test004a() {
this.runNegativeTest(
new String[] {
"X.java",
"import java.io.*;\n" +
"public class X {\n" +
" public static void main(String[] args) throws IOException {\n" +
" try (LineNumberReader r = new LineNumberReader(new BufferedReader(new FileReader(args[0])))) {\n" +
" String s;\n" +
" int r = 0;\n" +
" while ((s = r.readLine()) != null) {\n" +
" System.out.println(s);\n" +
" r++;\n" +
" }\n" +
" System.out.println(\"\" + r + \" lines\");\n" +
" }\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" int r = 0;\n" +
" ^\n" +
"Duplicate local variable r\n" +
"----------\n" +
"2. ERROR in X.java (at line 7)\n" +
" while ((s = r.readLine()) != null) {\n" +
" ^^^^^^^^^^^^\n" +
"Cannot invoke readLine() on the primitive type int\n" +
"----------\n");
}
// check that resources are implicitly final
public void test005() {
this.runNegativeTest(
new String[] {
"X.java",
"import java.io.*;\n" +
"public class X {\n" +
" public static void main(String[] args) throws IOException {\n" +
" try (Reader r = new LineNumberReader(new BufferedReader(new FileReader(args[0])))) {\n" +
" r = new FileReader(args[0]);\n" +
" }\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" r = new FileReader(args[0]);\n" +
" ^\n" +
"The resource r of a try-with-resources statement cannot be assigned\n" +
"----------\n");
}
//check that try statement can be empty
public void test006() {
this.runNegativeTest( // cannot be a conform test as this triggers an AIOOB.
new String[] {
"X.java",
"import java.io.*;\n" +
"public class X {\n" +
" public static void main(String[] args) throws IOException {\n" +
" try (Reader r = new LineNumberReader(new BufferedReader(new FileReader(args[0])))) {\n" +
" } catch(Zork z) {" +
" }\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" } catch(Zork z) { }\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
//check that resources are implicitly final but they can be explicitly final
public void test007() {
this.runNegativeTest(
new String[] {
"X.java",
"import java.io.*;\n" +
"public class X {\n" +
" public static void main(String[] args) throws IOException {\n" +
" try (final Reader r = new LineNumberReader(new BufferedReader(new FileReader(args[0])))) {\n" +
" r = new FileReader(args[0]);\n" +
" }\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" r = new FileReader(args[0]);\n" +
" ^\n" +
"The resource r of a try-with-resources statement cannot be assigned\n" +
"----------\n");
}
// resource type tests
public void test008() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y [] i = null) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public void close () {}\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Y [] i = null) {\n" +
" ^^^^\n" +
"The resource type Y[] does not implement java.lang.AutoCloseable\n" +
"----------\n");
}
// Resource Type tests
public void test009() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y i [] = null) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public void close () {}\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Y i [] = null) {\n" +
" ^\n" +
"The resource type Y[] does not implement java.lang.AutoCloseable\n" +
"----------\n");
}
// Scope, visibility tests
public void test010() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(int p){\n" +
" int k;\n" +
" try (Y i = new Y(); Y i = new Y(); Y p = new Y(); Y k = new Y();) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public void close () {}\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" try (Y i = new Y(); Y i = new Y(); Y p = new Y(); Y k = new Y();) {\n" +
" ^\n" +
"Duplicate local variable i\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" try (Y i = new Y(); Y i = new Y(); Y p = new Y(); Y k = new Y();) {\n" +
" ^\n" +
"Duplicate local variable p\n" +
"----------\n" +
"3. ERROR in X.java (at line 4)\n" +
" try (Y i = new Y(); Y i = new Y(); Y p = new Y(); Y k = new Y();) {\n" +
" ^\n" +
"Duplicate local variable k\n" +
"----------\n");
}
// Scope, visibility tests
public void test011() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y i = new Y(); Y p = new Y(); Y k = new Y();) {\n" +
" System.out.println();\n" +
" }\n" +
" catch (Exception e) {\n" +
" System.out.println(i);\n" +
" }\n" +
" finally {\n" +
" System.out.println(p);\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public void close () {}\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" System.out.println(i);\n" +
" ^\n" +
"i cannot be resolved to a variable\n" +
"----------\n" +
"2. ERROR in X.java (at line 10)\n" +
" System.out.println(p);\n" +
" ^\n" +
"p cannot be resolved to a variable\n" +
"---" +
"-------\n");
}
// Scope, visibility related tests.
public void test012() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y i = new Y(); Y p = new Y(); Y k = new Y();) {\n" +
" try {\n" +
" System.out.println();\n" +
" } catch (Exception i) {\n" +
" }\n" +
" }\n" +
" catch (Exception e) {\n" +
" System.out.println(i);\n" +
" }\n" +
" finally {\n" +
" System.out.println(p);\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public void close () {}\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" } catch (Exception i) {\n" +
" ^\n" +
"Duplicate parameter i\n" +
"----------\n" +
"2. ERROR in X.java (at line 10)\n" +
" System.out.println(i);\n" +
" ^\n" +
"i cannot be resolved to a variable\n" +
"----------\n" +
"3. ERROR in X.java (at line 13)\n" +
" System.out.println(p);\n" +
" ^\n" +
"p cannot be resolved to a variable\n" +
"----------\n");
}
// Shadowing behavior tests
public void test013() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" try (Y y = new Y(); Y p = new Y()) {\n" +
" X x = new X() {\n" +
" public void foo(int p) {\n" +
" try {\n" +
" System.out.println();\n" +
" } catch (Exception y) {\n" +
" }\n" +
" }\n" +
" };\n" +
" } finally {\n" +
" System.out.println(y);\n" +
" }\n" +
" }\n" +
"}\n" +
"\n" +
"class Y implements AutoCloseable {\n" +
" public void close() {\n" +
" System.out.println();\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. WARNING in X.java (at line 5)\n" +
" public void foo(int p) {\n" +
" ^\n" +
"The parameter p is hiding another local variable defined in an enclosing type scope\n" +
"----------\n" +
"2. WARNING in X.java (at line 8)\n" +
" } catch (Exception y) {\n" +
" ^\n" +
"The parameter y is hiding another local variable defined in an enclosing type scope\n" +
"----------\n" +
"3. ERROR in X.java (at line 13)\n" +
" System.out.println(y);\n" +
" ^\n" +
"y cannot be resolved to a variable\n" +
"----------\n");
}
// Test for unhandled exceptions
public void test014() {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_ReportUnclosedCloseable, CompilerOptions.WARNING);
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) { \n" +
" try (Y y = new Y();) {\n" +
" if (y == null) {}\n" +
" Y why = new Y();\n" +
" System.out.println(\"Try block\");\n" +
" } finally {\n" +
" System.out.println(\"Finally block\");\n" +
" }\n" +
" }\n" +
"} \n" +
"\n" +
"class Y implements AutoCloseable {\n" +
" public Y() throws WeirdException {\n" +
" throw new WeirdException();\n" +
" }\n" +
" public void close() {\n" +
" System.out.println(\"Closing resource\");\n" +
" }\n" +
"}\n" +
"\n" +
"class WeirdException extends Throwable {}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Y y = new Y();) {\n" +
" ^^^^^^^\n" +
"Unhandled exception type WeirdException\n" +
"----------\n" +
"2. WARNING in X.java (at line 4)\n" +
" if (y == null) {}\n" +
" ^^\n" +
"Dead code\n" +
"----------\n" +
"3. WARNING in X.java (at line 5)\n" +
" Y why = new Y();\n" +
" ^^^\n" +
"Resource leak: 'why' is never closed\n" +
"----------\n" +
"4. ERROR in X.java (at line 5)\n" +
" Y why = new Y();\n" +
" ^^^^^^^\n" +
"Unhandled exception type WeirdException\n" +
"----------\n" +
"5. WARNING in X.java (at line 22)\n" +
" class WeirdException extends Throwable {}\n" +
" ^^^^^^^^^^^^^^\n" +
"The serializable class WeirdException does not declare a static final serialVersionUID field of type long\n" +
"----------\n",
null, true, options);
}
// Resource nullness tests
public void test015() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) { \n" +
" try (Y y = new Y();) {\n" +
" if (y == null)\n {}\n" +
" }\n" +
" }\n" +
"} \n" +
"\n" +
"class Y implements AutoCloseable {\n" +
" public void close() {\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. WARNING in X.java (at line 5)\n" +
" {}\n" +
" ^^\n" +
"Dead code\n" +
"----------\n");
}
// Dead code tests, resource nullness, unhandled exception tests
public void test016() {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_ReportUnclosedCloseable, CompilerOptions.WARNING);
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) { \n" +
" try (Y y = new Y();) {\n" +
" if (y == null) {}\n" +
" Y why = new Y();\n" +
" System.out.println(\"Try block\");\n" +
" }\n" +
" }\n" +
"} \n" +
"\n" +
"class Y implements AutoCloseable {\n" +
" public Y() throws WeirdException {\n" +
" throw new WeirdException();\n" +
" }\n" +
" public void close() {\n" +
" System.out.println(\"Closing resource\");\n" +
" }\n" +
"}\n" +
"\n" +
"class WeirdException extends Throwable {}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Y y = new Y();) {\n" +
" ^^^^^^^\n" +
"Unhandled exception type WeirdException\n" +
"----------\n" +
"2. WARNING in X.java (at line 4)\n" +
" if (y == null) {}\n" +
" ^^\n" +
"Dead code\n" +
"----------\n" +
"3. WARNING in X.java (at line 5)\n" +
" Y why = new Y();\n" +
" ^^^\n" +
"Resource leak: 'why' is never closed\n" +
"----------\n" +
"4. ERROR in X.java (at line 5)\n" +
" Y why = new Y();\n" +
" ^^^^^^^\n" +
"Unhandled exception type WeirdException\n" +
"----------\n" +
"5. WARNING in X.java (at line 20)\n" +
" class WeirdException extends Throwable {}\n" +
" ^^^^^^^^^^^^^^\n" +
"The serializable class WeirdException does not declare a static final serialVersionUID field of type long\n" +
"----------\n",
null,
true,
options);
}
// Dead code tests
public void test017() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) { \n" +
" try (Y y = new Y();) {\n" +
" if (y == null)\n {}\n" +
" } finally {\n" +
" }\n" +
" }\n" +
"} \n" +
"\n" +
"class Y implements AutoCloseable {\n" +
" public void close() {\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. WARNING in X.java (at line 5)\n" +
" {}\n" +
" ^^\n" +
"Dead code\n" +
"----------\n");
}
// Syntax error tests
public void test018() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) { \n" +
" try () {\n" +
" } finally {\n" +
" }\n" +
" }\n" +
"} \n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try () {\n" +
" ^\n" +
"Syntax error on token \"(\", Resources expected after this token\n" +
"----------\n");
}
// Unhandled exception tests
public void test020() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) {\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" throw new XXException();\n" +
" } catch (XException x) {\n" +
" } catch (YException y) {\n" +
" } catch (ZException z) {\n" +
" } finally {\n" +
" }\n" +
" }\n" +
" public X() throws XException {\n" +
" throw new XException();\n" +
" }\n" +
" public void close() throws XXException {\n" +
" throw new XXException();\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() throws YException {\n" +
" throw new YException();\n" +
" }\n" +
" public void close() throws YYException {\n" +
" throw new YYException();\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() throws ZException {\n" +
" throw new ZException();\n" +
" }\n" +
" public void close() throws ZZException {\n" +
" throw new ZZException();\n" +
" }\n" +
"}\n" +
"class XException extends Exception {}\n" +
"class XXException extends Exception {}\n" +
"class YException extends Exception {}\n" +
"class YYException extends Exception {}\n" +
"class ZException extends Exception {}\n" +
"class ZZException extends Exception {}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" ^\n" +
"Unhandled exception type XXException thrown by automatic close() invocation on x\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" ^\n" +
"Unhandled exception type YYException thrown by automatic close() invocation on y\n" +
"----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" ^\n" +
"Unhandled exception type ZZException thrown by automatic close() invocation on z\n" +
"----------\n" +
"4. ERROR in X.java (at line 4)\n" +
" throw new XXException();\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Unhandled exception type XXException\n" +
"----------\n" +
"5. WARNING in X.java (at line 34)\n" +
" class XException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class XException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"6. WARNING in X.java (at line 35)\n" +
" class XXException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class XXException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"7. WARNING in X.java (at line 36)\n" +
" class YException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class YException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"8. WARNING in X.java (at line 37)\n" +
" class YYException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class YYException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"9. WARNING in X.java (at line 38)\n" +
" class ZException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class ZException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"10. WARNING in X.java (at line 39)\n" +
" class ZZException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class ZZException does not declare a static final serialVersionUID field of type long\n" +
"----------\n");
}
// Resource type test
public void test021() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y i = null) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y {\n" +
" public void close () {}\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Y i = null) {\n" +
" ^\n" +
"The resource type Y does not implement java.lang.AutoCloseable\n" +
"----------\n");
}
// Interface method return type compatibility test
public void test022() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y i = null) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public int close () { return 0; }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" public int close () { return 0; }\n" +
" ^^^\n" +
"The return type is incompatible with AutoCloseable.close()\n" +
"----------\n");
}
// Exception handling, compatibility tests
public void test023() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y i = null) {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public void close () throws Blah {}\n" +
"}\n" +
"class Blah extends Throwable {}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Y i = null) {\n" +
" ^\n" +
"Unhandled exception type Blah thrown by automatic close() invocation on i\n" +
"----------\n" +
"2. ERROR in X.java (at line 9)\n" +
" public void close () throws Blah {}\n" +
" ^^^^^^^^^^^^^^^^^^^^\n" +
"Exception Blah is not compatible with throws clause in AutoCloseable.close()\n" +
"----------\n" +
"3. WARNING in X.java (at line 11)\n" +
" class Blah extends Throwable {}\n" +
" ^^^^\n" +
"The serializable class Blah does not declare a static final serialVersionUID field of type long\n" +
"----------\n");
}
// Exception handling tests
public void test024() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) {\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" throw new XXException();\n" +
" } catch (XException x) {\n" +
" } catch (YException y) {\n" +
" } catch (ZException z) {\n" +
" } catch (XXException x) {\n" +
" } catch (YYException y) {\n" +
" } catch (ZZException z) {\n" +
" } finally {\n" +
" }\n" +
" }\n" +
" public X() throws XException {\n" +
" throw new XException();\n" +
" }\n" +
" public void close() throws XXException {\n" +
" throw new XXException();\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() throws YException {\n" +
" throw new YException();\n" +
" }\n" +
" public void close() throws YYException {\n" +
" throw new YYException();\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() throws ZException {\n" +
" throw new ZException();\n" +
" }\n" +
" public void close() throws ZZException {\n" +
" throw new ZZException();\n" +
" }\n" +
"}\n" +
"class XException extends Exception {}\n" +
"class XXException extends Exception {}\n" +
"class YException extends Exception {}\n" +
"class YYException extends Exception {}\n" +
"class ZException extends Exception {}\n" +
"class ZZException extends Exception {}\n"
},
"----------\n" +
"1. WARNING in X.java (at line 37)\n" +
" class XException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class XException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"2. WARNING in X.java (at line 38)\n" +
" class XXException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class XXException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"3. WARNING in X.java (at line 39)\n" +
" class YException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class YException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"4. WARNING in X.java (at line 40)\n" +
" class YYException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class YYException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"5. WARNING in X.java (at line 41)\n" +
" class ZException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class ZException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"6. WARNING in X.java (at line 42)\n" +
" class ZZException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class ZZException does not declare a static final serialVersionUID field of type long\n" +
"----------\n");
}
// Unhandled exception tests
public void test025() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) {\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" throw new XXException();\n" +
" } catch (XException x) {\n" +
" } catch (YException y) {\n" +
" } catch (ZException z) {\n" +
" \n" +
" }\n" +
" }\n" +
" public X() throws XException {\n" +
" throw new XException();\n" +
" }\n" +
" public void close() throws XXException {\n" +
" throw new XXException();\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() throws YException {\n" +
" throw new YException();\n" +
" }\n" +
" public void close() throws YYException {\n" +
" throw new YYException();\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() throws ZException {\n" +
" throw new ZException();\n" +
" }\n" +
" public void close() throws ZZException {\n" +
" throw new ZZException();\n" +
" }\n" +
"}\n" +
"class XException extends Exception {}\n" +
"class XXException extends Exception {}\n" +
"class YException extends Exception {}\n" +
"class YYException extends Exception {}\n" +
"class ZException extends Exception {}\n" +
"class ZZException extends Exception {}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" ^\n" +
"Unhandled exception type XXException thrown by automatic close() invocation on x\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" ^\n" +
"Unhandled exception type YYException thrown by automatic close() invocation on y\n" +
"----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" ^\n" +
"Unhandled exception type ZZException thrown by automatic close() invocation on z\n" +
"----------\n" +
"4. ERROR in X.java (at line 4)\n" +
" throw new XXException();\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Unhandled exception type XXException\n" +
"----------\n" +
"5. WARNING in X.java (at line 34)\n" +
" class XException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class XException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"6. WARNING in X.java (at line 35)\n" +
" class XXException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class XXException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"7. WARNING in X.java (at line 36)\n" +
" class YException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class YException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"8. WARNING in X.java (at line 37)\n" +
" class YYException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class YYException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"9. WARNING in X.java (at line 38)\n" +
" class ZException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class ZException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"10. WARNING in X.java (at line 39)\n" +
" class ZZException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class ZZException does not declare a static final serialVersionUID field of type long\n" +
"----------\n");
}
public void test026() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) {\n" +
" try (X x = new X(); Y y = new Y(); Z z = new Z()) {\n" +
" throw new XXException();\n" +
" } catch (XException x) {\n" +
" } catch (YException y) {\n" +
" } catch (ZException z) {\n" +
" } catch (XXException x) {\n" +
" } catch (YYException y) {\n" +
" } catch (ZZException z) {\n\n" +
" }\n" +
" }\n" +
" public X() throws XException {\n" +
" throw new XException();\n" +
" }\n" +
" public void close() throws XXException {\n" +
" throw new XXException();\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() throws YException {\n" +
" throw new YException();\n" +
" }\n" +
" public void close() throws YYException {\n" +
" throw new YYException();\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() throws ZException {\n" +
" throw new ZException();\n" +
" }\n" +
" public void close() throws ZZException {\n" +
" throw new ZZException();\n" +
" }\n" +
"}\n" +
"class XException extends Exception {}\n" +
"class XXException extends Exception {}\n" +
"class YException extends Exception {}\n" +
"class YYException extends Exception {}\n" +
"class ZException extends Exception {}\n" +
"class ZZException extends Exception {}\n"
},
"----------\n" +
"1. WARNING in X.java (at line 37)\n" +
" class XException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class XException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"2. WARNING in X.java (at line 38)\n" +
" class XXException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class XXException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"3. WARNING in X.java (at line 39)\n" +
" class YException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class YException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"4. WARNING in X.java (at line 40)\n" +
" class YYException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class YYException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"5. WARNING in X.java (at line 41)\n" +
" class ZException extends Exception {}\n" +
" ^^^^^^^^^^\n" +
"The serializable class ZException does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"6. WARNING in X.java (at line 42)\n" +
" class ZZException extends Exception {}\n" +
" ^^^^^^^^^^^\n" +
"The serializable class ZZException does not declare a static final serialVersionUID field of type long\n" +
"----------\n");
}
public void test027() {
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) throws Exception {\n" +
" try (X x = new X(); Y y = new Y()) {\n" +
" System.out.println(\"Body\");\n" +
" throw new Exception(\"Body\");\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable [] suppressed = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; i++) {\n" +
" System.out.println(\"Suppressed:\" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" int finallyVar = 10;\n" +
" System.out.println(finallyVar);\n" +
" }\n" +
" }\n" +
" public X() {\n" +
" System.out.println(\"X CTOR\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"X Close\");\n" +
" throw new Exception(\"X Close\");\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() {\n" +
" System.out.println(\"Y CTOR\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Y Close\");\n" +
" throw new Exception(\"Y Close\");\n" +
" }\n" +
"}\n"
},
"X CTOR\n" +
"Y CTOR\n" +
"Body\n" +
"Y Close\n" +
"X Close\n" +
"java.lang.Exception: Body\n" +
"Suppressed:java.lang.Exception: Y Close\n" +
"Suppressed:java.lang.Exception: X Close\n" +
"10");
}
public void test028() {
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) throws Exception {\n" +
" try (X x = new X(); Y y = new Y()) {\n" +
" System.out.println(\"Body\");\n" +
" } catch (Exception e) {\n" +
" e.printStackTrace();\n" +
" }\n" +
" }\n" +
" public X() {\n" +
" System.out.println(\"X CTOR\");\n" +
" }\n" +
" public void close() {\n" +
" System.out.println(\"X DTOR\");\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() {\n" +
" System.out.println(\"Y CTOR\");\n" +
" }\n" +
" public void close() {\n" +
" System.out.println(\"Y DTOR\");\n" +
" }\n" +
"}\n"
},
"X CTOR\n" +
"Y CTOR\n" +
"Body\n" +
"Y DTOR\n" +
"X DTOR");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=338881
public void test029() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.File;\n" +
"import java.io.FileReader;\n" +
"import java.io.IOException;\n" +
"public class X {\n" +
" void foo() {\n" +
" File file = new File(\"somefile\");\n" +
" try(FileReader fileReader = new FileReader(file);) {\n" +
" char[] in = new char[50];\n" +
" fileReader.read(in);\n" +
" } catch (IOException e) {\n" +
" System.out.println(\"Got IO exception\");\n" +
" } finally{\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
"}\n"
},
"Got IO exception");
}
public void test030() { // test return + resources
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) throws Exception { \n" +
" final boolean getOut = true;\n" +
" System.out.println(\"Main\");\n" +
" try (X x1 = new X(); X x2 = new X()) {\n" +
" System.out.println(\"Outer Try\");\n" +
" while (true) {\n" +
" try (Y y1 = new Y(); Y y2 = new Y()) {\n" +
" System.out.println(\"Middle Try\");\n" +
" try (Z z1 = new Z(); Z z2 = new Z()) {\n" +
" System.out.println(\"Inner Try\");\n" +
" if (getOut) \n" +
" return;\n" +
" else\n" +
" break;\n" +
" }\n" +
" }\n" +
" }\n" +
" System.out.println(\"Out of while\");\n" +
" }\n" +
" }\n" +
" public X() {\n" +
" System.out.println(\"X::X\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"X::~X\");\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() {\n" +
" System.out.println(\"Y::Y\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Y::~Y\");\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() {\n" +
" System.out.println(\"Z::Z\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Z::~Z\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"X::X\n" +
"X::X\n" +
"Outer Try\n" +
"Y::Y\n" +
"Y::Y\n" +
"Middle Try\n" +
"Z::Z\n" +
"Z::Z\n" +
"Inner Try\n" +
"Z::~Z\n" +
"Z::~Z\n" +
"Y::~Y\n" +
"Y::~Y\n" +
"X::~X\n" +
"X::~X");
}
public void test030a() { // test return + resources + with exceptions being thrown by close()
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) throws Exception { \n" +
" final boolean getOut = true;\n" +
" System.out.println(\"Main\");\n" +
" try (X x1 = new X(); X x2 = new X()) {\n" +
" System.out.println(\"Outer Try\");\n" +
" while (true) {\n" +
" try (Y y1 = new Y(); Y y2 = new Y()) {\n" +
" System.out.println(\"Middle Try\");\n" +
" try (Z z1 = new Z(); Z z2 = new Z()) {\n" +
" System.out.println(\"Inner Try\");\n" +
" if (getOut) \n" +
" return;\n" +
" else\n" +
" break;\n" +
" }\n" +
" }\n" +
" }\n" +
" System.out.println(\"Out of while\");\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" }\n" +
" }\n" +
" public X() {\n" +
" System.out.println(\"X::X\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"X::~X\");\n" +
" throw new Exception(\"X::~X\");\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() {\n" +
" System.out.println(\"Y::Y\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Y::~Y\");\n" +
" throw new Exception(\"Y::~Y\");\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() {\n" +
" System.out.println(\"Z::Z\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Z::~Z\");\n" +
" throw new Exception(\"Z::~Z\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"X::X\n" +
"X::X\n" +
"Outer Try\n" +
"Y::Y\n" +
"Y::Y\n" +
"Middle Try\n" +
"Z::Z\n" +
"Z::Z\n" +
"Inner Try\n" +
"Z::~Z\n" +
"Z::~Z\n" +
"Y::~Y\n" +
"Y::~Y\n" +
"X::~X\n" +
"X::~X\n" +
"java.lang.Exception: Z::~Z\n" +
"Suppressed: java.lang.Exception: Z::~Z\n" +
"Suppressed: java.lang.Exception: Y::~Y\n" +
"Suppressed: java.lang.Exception: Y::~Y\n" +
"Suppressed: java.lang.Exception: X::~X\n" +
"Suppressed: java.lang.Exception: X::~X");
}
public void test031() { // test break + resources
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) throws Exception { \n" +
" final boolean getOut = false;\n" +
" System.out.println(\"Main\");\n" +
" try (X x1 = new X(); X x2 = new X()) {\n" +
" System.out.println(\"Outer Try\");\n" +
" while (true) {\n" +
" try (Y y1 = new Y(); Y y2 = new Y()) {\n" +
" System.out.println(\"Middle Try\");\n" +
" try (Z z1 = new Z(); Z z2 = new Z()) {\n" +
" System.out.println(\"Inner Try\");\n" +
" if (getOut) \n" +
" return;\n" +
" else\n" +
" break;\n" +
" }\n" +
" }\n" +
" }\n" +
" System.out.println(\"Out of while\");\n" +
" }\n" +
" }\n" +
" public X() {\n" +
" System.out.println(\"X::X\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"X::~X\");\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() {\n" +
" System.out.println(\"Y::Y\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Y::~Y\");\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() {\n" +
" System.out.println(\"Z::Z\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Z::~Z\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"X::X\n" +
"X::X\n" +
"Outer Try\n" +
"Y::Y\n" +
"Y::Y\n" +
"Middle Try\n" +
"Z::Z\n" +
"Z::Z\n" +
"Inner Try\n" +
"Z::~Z\n" +
"Z::~Z\n" +
"Y::~Y\n" +
"Y::~Y\n" +
"Out of while\n" +
"X::~X\n" +
"X::~X");
}
public void test032() { // test continue + resources
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) throws Exception { \n" +
" final boolean getOut = false;\n" +
" System.out.println(\"Main\");\n" +
" try (X x1 = new X(); X x2 = new X()) {\n" +
" System.out.println(\"Outer Try\");\n" +
" boolean more = true;\n" +
" while (more) {\n" +
" try (Y y1 = new Y(); Y y2 = new Y()) {\n" +
" System.out.println(\"Middle Try\");\n" +
" try (Z z1 = new Z(); Z z2 = new Z()) {\n" +
" System.out.println(\"Inner Try\");\n" +
" more = false;\n" +
" continue;\n" +
" } finally { \n" +
" System.out.println(\"Inner Finally\");\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"Middle Finally\");\n" +
" }\n" +
" }\n" +
" System.out.println(\"Out of while\");\n" +
" } finally {\n" +
" System.out.println(\"Outer Finally\");\n" +
" }\n" +
" }\n" +
" public X() {\n" +
" System.out.println(\"X::X\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"X::~X\");\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() {\n" +
" System.out.println(\"Y::Y\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Y::~Y\");\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() {\n" +
" System.out.println(\"Z::Z\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Z::~Z\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"X::X\n" +
"X::X\n" +
"Outer Try\n" +
"Y::Y\n" +
"Y::Y\n" +
"Middle Try\n" +
"Z::Z\n" +
"Z::Z\n" +
"Inner Try\n" +
"Z::~Z\n" +
"Z::~Z\n" +
"Inner Finally\n" +
"Y::~Y\n" +
"Y::~Y\n" +
"Middle Finally\n" +
"Out of while\n" +
"X::~X\n" +
"X::~X\n" +
"Outer Finally");
}
public void test033() { // test null resources
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" public static void main(String [] args) throws Exception { \n" +
" final boolean getOut = false;\n" +
" System.out.println(\"Main\");\n" +
" try (X x1 = null; Y y = new Y(); Z z = null) {\n" +
" System.out.println(\"Body\");\n" +
" } finally {\n" +
" System.out.println(\"Outer Finally\");\n" +
" }\n" +
" }\n" +
" public X() {\n" +
" System.out.println(\"X::X\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"X::~X\");\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() {\n" +
" System.out.println(\"Y::Y\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Y::~Y\");\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() {\n" +
" System.out.println(\"Z::Z\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Z::~Z\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"Y::Y\n" +
"Body\n" +
"Y::~Y\n" +
"Outer Finally");
}
public void test034() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" throw new Exception(\"Body\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" throw new Exception (\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" throw new Exception (\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" throw new Exception (\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" throw new Exception (\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" throw new Exception (\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" throw new Exception (\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" throw new Exception (\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"java.lang.Exception: A::A\n" +
"All done");
}
public void test035() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" throw new Exception(\"Body\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" throw new Exception (\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" throw new Exception (\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" throw new Exception (\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" throw new Exception (\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" throw new Exception (\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" throw new Exception (\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"A::~A\n" +
"java.lang.Exception: B::B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test036() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" throw new Exception(\"Body\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" throw new Exception (\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" throw new Exception (\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" throw new Exception (\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" throw new Exception (\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" throw new Exception (\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: C::C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test037() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" throw new Exception(\"Body\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" throw new Exception (\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" throw new Exception (\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" throw new Exception (\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" throw new Exception (\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: D::D\n" +
"Suppressed: java.lang.Exception: C::~C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test038() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" throw new Exception(\"Body\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" throw new Exception (\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" throw new Exception (\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" throw new Exception (\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: E::E\n" +
"Suppressed: java.lang.Exception: D::~D\n" +
"Suppressed: java.lang.Exception: C::~C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test039() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" throw new Exception(\"Body\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" throw new Exception (\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" throw new Exception (\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: F::F\n" +
"Suppressed: java.lang.Exception: E::~E\n" +
"Suppressed: java.lang.Exception: D::~D\n" +
"Suppressed: java.lang.Exception: C::~C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test040() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" throw new Exception(\"Body\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" throw new Exception (\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"Inner try\n" +
"F::~F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: Body\n" +
"Suppressed: java.lang.Exception: F::~F\n" +
"Suppressed: java.lang.Exception: E::~E\n" +
"Suppressed: java.lang.Exception: D::~D\n" +
"Suppressed: java.lang.Exception: C::~C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test041() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" throw new Exception (\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"Inner try\n" +
"F::~F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: F::~F\n" +
"Suppressed: java.lang.Exception: E::~E\n" +
"Suppressed: java.lang.Exception: D::~D\n" +
"Suppressed: java.lang.Exception: C::~C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test042() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"Inner try\n" +
"F::~F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: E::~E\n" +
"Suppressed: java.lang.Exception: D::~D\n" +
"Suppressed: java.lang.Exception: C::~C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test043() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" throw new Exception (\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"Inner try\n" +
"F::~F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: D::~D\n" +
"Suppressed: java.lang.Exception: C::~C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test044() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"Inner try\n" +
"F::~F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: C::~C\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test045() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" throw new Exception (\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"Inner try\n" +
"F::~F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
public void test046() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" throw new Exception (\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"Inner try\n" +
"F::~F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"java.lang.Exception: A::~A\n" +
"All done");
}
public void test047() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A(); B b = new B()) {\n" +
" System.out.println(\"Outer try\");\n" +
" try (C c = new C(); D d = new D();) {\n" +
" System.out.println(\"Middle try\");\n" +
" try (E e = new E(); F f = new F()) {\n" +
" System.out.println(\"Inner try\");\n" +
" } \n" +
" }\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" }\n" +
"}\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" }\n" +
"}\n" +
"class D implements AutoCloseable {\n" +
" public D () throws Exception {\n" +
" System.out.println(\"D::D\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"D::~D\");\n" +
" }\n" +
"}\n" +
"class E implements AutoCloseable {\n" +
" public E () throws Exception {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" }\n" +
"}\n" +
"class F implements AutoCloseable {\n" +
" public F () throws Exception {\n" +
" System.out.println(\"F::F\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"F::~F\");\n" +
" }\n" +
"}\n" +
"class G implements AutoCloseable {\n" +
" public G () throws Exception {\n" +
" System.out.println(\"G::G\");\n" +
" throw new Exception (\"G::G\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"G::~G\");\n" +
" throw new Exception (\"G::~G\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"B::B\n" +
"Outer try\n" +
"C::C\n" +
"D::D\n" +
"Middle try\n" +
"E::E\n" +
"F::F\n" +
"Inner try\n" +
"F::~F\n" +
"E::~E\n" +
"D::~D\n" +
"C::~C\n" +
"B::~B\n" +
"A::~A\n" +
"All done");
}
public void test048() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (A a = new A()) {\n" +
" System.out.println(\"X::Try\");\n" +
" throw new Exception(\"X::Main\");\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}\n" +
"\n" +
"class A implements AutoCloseable {\n" +
" public A () throws Exception {\n" +
" System.out.println(\"A::A\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"A::~A\");\n" +
" try (B b = new B()) {\n" +
" System.out.println(\"A::~A::Try\");\n" +
" throw new Exception(\"A::~A\");\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" throw e;\n" +
" } \n" +
" }\n" +
"}\n" +
"\n" +
"class B implements AutoCloseable {\n" +
" public B () throws Exception {\n" +
" System.out.println(\"B::B\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"B::~B\");\n" +
" try (C c = new C()) {\n" +
" System.out.println(\"B::~B::Try\");\n" +
" throw new Exception (\"B::~B\");\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" throw e;\n" +
" } \n" +
" }\n" +
"}\n" +
"class C implements AutoCloseable {\n" +
" public C () throws Exception {\n" +
" System.out.println(\"C::C\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"C::~C\");\n" +
" throw new Exception (\"C::~C\");\n" +
" } \n" +
"}\n"
},
"Main\n" +
"A::A\n" +
"X::Try\n" +
"A::~A\n" +
"B::B\n" +
"A::~A::Try\n" +
"B::~B\n" +
"C::C\n" +
"B::~B::Try\n" +
"C::~C\n" +
"java.lang.Exception: B::~B\n" +
"Suppressed: java.lang.Exception: C::~C\n" +
"java.lang.Exception: A::~A\n" +
"Suppressed: java.lang.Exception: B::~B\n" +
"java.lang.Exception: X::Main\n" +
"Suppressed: java.lang.Exception: A::~A\n" +
"All done");
}
//ensure that it doesn't completely fail when using TWR and 1.5 mode
public void test049() {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5);
options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5);
options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5);
this.runNegativeTest(
new String[] {
"X.java",
"import java.io.File;\n" +
"import java.io.FileReader;\n" +
"import java.io.IOException;\n" +
"public class X {\n" +
" void foo() {\n" +
" File file = new File(\"somefile\");\n" +
" try(FileReader fileReader = new FileReader(file);) {\n" +
" char[] in = new char[50];\n" +
" fileReader.read(in);\n" +
" } catch (IOException e) {\n" +
" System.out.println(\"Got IO exception\");\n" +
" } finally{\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" try(FileReader fileReader = new FileReader(file);) {\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Resource specification not allowed here for source level below 1.7\n" +
"----------\n",
null,
true,
options);
}
public void test050() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String [] args) {\n" +
" System.out.println(\"Main\");\n" +
" try (E e = E.CONST) {\n" +
" System.out.println(\"Outer try\");\n" +
" } catch (Exception e) {\n" +
" System.out.println(e);\n" +
" Throwable suppressed [] = e.getSuppressed();\n" +
" for (int i = 0; i < suppressed.length; ++i) {\n" +
" System.out.println(\"Suppressed: \" + suppressed[i]);\n" +
" }\n" +
" } finally {\n" +
" System.out.println(\"All done\");\n" +
" }\n" +
" }\n" +
"}",
"E.java",
"public enum E implements AutoCloseable {\n" +
" CONST;\n" +
" private E () {\n" +
" System.out.println(\"E::E\");\n" +
" }\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"E::~E\");\n" +
" throw new Exception (\"E::~E\");\n" +
" }\n" +
"}"
},
"Main\n" +
"E::E\n" +
"Outer try\n" +
"E::~E\n" +
"java.lang.Exception: E::~E\n" +
"All done");
}
public void test051() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) throws Throwable {\n" +
" try (Test t = new Test()) {\n" +
" for (int i = 0; i < 10; i++) {\n" +
" }\n" +
"\n" +
"\n" +
" } \n" +
"\n" +
" catch (Exception e) {\n" +
" StackTraceElement t = e.getStackTrace()[1];\n" +
" String file = t.getFileName();\n" +
" int line = t.getLineNumber();\n" +
" System.out.println(\"File = \" + file + \" \" + \"line = \" + line);\n" +
" }\n" +
" }\n" +
"}\n" +
"class Test implements AutoCloseable {\n" +
" public void close() throws Exception {\n" +
" throw new Exception();\n" +
" }\n" +
"}\n"
},
"File = X.java line = 8");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=348406
public void test052() {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5);
options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5);
options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5);
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) throws Throwable {\n" +
" try (Test t = new Test()) {\n" +
" } \n" +
" }\n" +
"}\n" +
"class Test {\n" +
" public void close() throws Exception {\n" +
" throw new Exception();\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Test t = new Test()) {\n" +
" ^^^^^^^^^^^^^^^^^^^\n" +
"Resource specification not allowed here for source level below 1.7\n" +
"----------\n",
null,
true,
options);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=348705
// Unhandled exception due to autoclose should be reported separately
public void test053() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y y = new Y()) { \n" +
" y.close();\n" +
" System.out.println();\n" +
" } catch (RuntimeException e) {\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements Managed {\n" +
" public Y() throws CloneNotSupportedException {}\n" +
" public void close () throws ClassNotFoundException, java.io.IOException {\n" +
" }\n" +
"}\n" +
"interface Managed extends AutoCloseable {}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Y y = new Y()) { \n" +
" ^\n" +
"Unhandled exception type ClassNotFoundException thrown by automatic close() invocation on y\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" try (Y y = new Y()) { \n" +
" ^\n" +
"Unhandled exception type IOException thrown by automatic close() invocation on y\n" +
"----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" try (Y y = new Y()) { \n" +
" ^^^^^^^\n" +
"Unhandled exception type CloneNotSupportedException\n" +
"----------\n" +
"4. ERROR in X.java (at line 4)\n" +
" y.close();\n" +
" ^^^^^^^^^\n" +
"Unhandled exception type ClassNotFoundException\n" +
"----------\n" +
"5. ERROR in X.java (at line 4)\n" +
" y.close();\n" +
" ^^^^^^^^^\n" +
"Unhandled exception type IOException\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=348705
// Variant of the above, witness for https://bugs.eclipse.org/358827#c6
public void test053a() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void method1(){\n" +
" try (Y y = new Y()) { \n" +
" y.close();\n" +
" System.out.println();\n" +
" } catch (RuntimeException e) {\n" +
" } finally {\n" +
" System.out.println();\n" +
" }\n" +
" }\n" +
"}\n" +
"class Y implements Managed {\n" +
" public Y() throws CloneNotSupportedException {}\n" +
" public void close () throws ClassNotFoundException, java.io.IOException {\n" +
" }\n" +
"}\n" +
"interface Managed extends AutoCloseable {}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Y y = new Y()) { \n" +
" ^\n" +
"Unhandled exception type ClassNotFoundException thrown by automatic close() invocation on y\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" try (Y y = new Y()) { \n" +
" ^\n" +
"Unhandled exception type IOException thrown by automatic close() invocation on y\n" +
"----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" try (Y y = new Y()) { \n" +
" ^^^^^^^\n" +
"Unhandled exception type CloneNotSupportedException\n" +
"----------\n" +
"4. ERROR in X.java (at line 4)\n" +
" y.close();\n" +
" ^^^^^^^^^\n" +
"Unhandled exception type ClassNotFoundException\n" +
"----------\n" +
"5. ERROR in X.java (at line 4)\n" +
" y.close();\n" +
" ^^^^^^^^^\n" +
"Unhandled exception type IOException\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=349862 (NPE when union type is used in the resource section.)
public void test054() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo() {\n" +
" try (Object | Integer res = null) {\n" +
" } catch (Exception e) {\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Object | Integer res = null) {\n" +
" ^\n" +
"Syntax error on token \"|\", . expected\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=349862 (NPE when union type is used in the resource section.)
public void test054a() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo() {\n" +
" try (Object.Integer res = null) {\n" +
" } catch (Exception e) {\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" try (Object.Integer res = null) {\n" +
" ^^^^^^^^^^^^^^\n" +
"Object.Integer cannot be resolved to a type\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353535 (verify error with try with resources)
public void test055() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.ByteArrayInputStream;\n" +
"import java.io.InputStream;\n" +
"public class X {\n" +
"public static void main(String[] args) throws Exception {\n" +
" int b;\n" +
" try (final InputStream in = new ByteArrayInputStream(new byte[] { 42 })) {\n" +
" b = in.read();\n" +
" }\n" +
" System.out.println(\"Done\");\n" +
"}\n" +
"}\n",
},
"Done");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=353535 (verify error with try with resources)
public void test055a() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) throws Throwable {\n" +
" int tmp;\n" +
" try (A a = null) {\n" +
" try (A b = null) {\n" +
" tmp = 0;\n" +
" }\n" +
" }\n" +
" System.out.println(\"Done\");\n" +
" }\n" +
"}\n" +
"class A implements AutoCloseable {\n" +
" @Override\n" +
" public void close() {\n" +
" }\n" +
"}\n",
},
"Done");
}
// Note: test056* have been moved to ResourceLeakTests.java
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=361053
public void test057() {
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" @Override\n" +
" public void close() throws Exception {\n" +
" throw new Exception();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final boolean foo;\n" +
" try (X a = new X(); X b = new X()) {\n" +
" foo = true;\n" +
" } catch (final Exception exception) {\n" +
" return;\n" +
" }\n" +
" }\n" +
"}\n"
}, "");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=364008
public void test058() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.ByteArrayOutputStream;\n" +
"import java.io.FileOutputStream;\n" +
"import java.io.IOException;\n" +
"\n" +
"public class X {\n" +
"\n" +
" public static void main(final String[] args) throws IOException {\n" +
" byte[] data;\n" +
" try (final ByteArrayOutputStream os = new ByteArrayOutputStream();\n" +
" final FileOutputStream out = new FileOutputStream(\"test.dat\")) {\n" +
" data = os.toByteArray();\n" +
" }\n" +
" }\n" +
"}\n"
}, "");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=367566 - In try-with-resources statement close() method of resource is not called
public void test059() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.IOException;\n" +
"\n" +
"public class X implements java.lang.AutoCloseable {\n" +
" static boolean isOpen = true;\n" +
" public static void main(final String[] args) throws IOException {\n" +
" foo();\n" +
" System.out.println(isOpen);\n" +
" }\n" +
" static boolean foo() {\n" +
" try (final X x = new X()) {\n" +
" return x.num() >= 1;\n" +
" }\n" +
" }\n" +
" int num() { return 2; }\n" +
" public void close() {\n" +
" isOpen = false;\n" +
" }\n" +
"}\n"
},
"false");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=367566 - In try-with-resources statement close() method of resource is not called
public void test060() {
this.runConformTest(
new String[] {
"X.java",
"public class X implements AutoCloseable {\n" +
" static int num = 10 ;\n" +
" public static void main(String [] args) throws Exception { \n" +
" System.out.println(foo(1));\n" +
" System.out.println(foo(2));\n" +
" System.out.println(foo(3));\n" +
" }\n" +
" private static boolean foo(int where) throws Exception {\n" +
" final boolean getOut = true;\n" +
" System.out.println(\"Main\");\n" +
" try (X x1 = new X(); X x2 = new X()) {\n" +
" if (where == 1) {\n" +
" return where == 1;\n" +
" }\n" +
" System.out.println(\"Outer Try\");\n" +
" while (true) {\n" +
" try (Y y1 = new Y(); Y y2 = new Y()) { \n" +
" if (where == 2) {\n" +
" return where == 2;\n" +
" } \n" +
" System.out.println(\"Middle Try\");\n" +
" try (Z z1 = new Z(); Z z2 = new Z()) {\n" +
" System.out.println(\"Inner Try\");\n" +
" if (getOut) \n" +
" return num >= 10;\n" +
" else\n" +
" break; \n" +
" }\n" +
" }\n" +
" }\n" +
" System.out.println(\"Out of while\");\n" +
" }\n" +
" return false;\n" +
" }\n" +
" public X() {\n" +
" System.out.println(\"X::X\");\n" +
" }\n" +
" @Override\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"X::~X\");\n" +
" }\n" +
"}\n" +
"class Y implements AutoCloseable {\n" +
" public Y() {\n" +
" System.out.println(\"Y::Y\");\n" +
" }\n" +
" @Override\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Y::~Y\");\n" +
" }\n" +
"}\n" +
"class Z implements AutoCloseable {\n" +
" public Z() {\n" +
" System.out.println(\"Z::Z\");\n" +
" }\n" +
" @Override\n" +
" public void close() throws Exception {\n" +
" System.out.println(\"Z::~Z\");\n" +
" }\n" +
"}\n"
},
"Main\n" +
"X::X\n" +
"X::X\n" +
"X::~X\n" +
"X::~X\n" +
"true\n" +
"Main\n" +
"X::X\n" +
"X::X\n" +
"Outer Try\n" +
"Y::Y\n" +
"Y::Y\n" +
"Y::~Y\n" +
"Y::~Y\n" +
"X::~X\n" +
"X::~X\n" +
"true\n" +
"Main\n" +
"X::X\n" +
"X::X\n" +
"Outer Try\n" +
"Y::Y\n" +
"Y::Y\n" +
"Middle Try\n" +
"Z::Z\n" +
"Z::Z\n" +
"Inner Try\n" +
"Z::~Z\n" +
"Z::~Z\n" +
"Y::~Y\n" +
"Y::~Y\n" +
"X::~X\n" +
"X::~X\n" +
"true");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=375248 (AIOOB with try with resources)
public void test375248() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.IOException;\n" +
"import java.io.InputStream;\n" +
"import java.net.MalformedURLException;\n" +
"import java.net.URL;\n" +
"\n" +
"public class X {\n" +
" public static void main(String[] args) throws Exception {\n" +
" System.out.println(\"Done\");\n" +
" }\n" +
" public void foo() throws MalformedURLException {\n" +
" URL url = new URL(\"dummy\"); //$NON-NLS-1$\n" +
" try (InputStream is = url.openStream()) {\n" +
" } catch (IOException e) {\n" +
" return;\n" +
" } finally {\n" +
" try {\n" +
" java.nio.file.Files.delete(null);\n" +
" } catch (IOException e1) {\n" +
" }\n" +
" }\n" +
" }\n" +
"}\n",
},
"Done");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=375248 (AIOOB with try with resources)
public void test375248a() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.File;\n" +
"import java.io.IOException;\n" +
"import java.io.InputStream;\n" +
"import java.net.MalformedURLException;\n" +
"import java.net.URL;\n" +
"import java.nio.file.Path;\n" +
"import java.nio.file.StandardCopyOption;\n" +
"\n" +
"public class X {\n" +
" public static void main(String[] args) throws Exception {\n" +
" System.out.println(\"Done\");\n" +
" }\n" +
" public void executeImports() throws MalformedURLException {\n" +
" for (int i = 0; i < 3; i++) {\n" +
" URL url = new URL(\"dummy\"); //$NON-NLS-1$\n" +
" if (url != null) {\n" +
" Path target = new File(\"dummy\").toPath();\n" +
" try (InputStream is = url.openStream()) {\n" +
" java.nio.file.Files.copy(is, target,\n" +
" StandardCopyOption.REPLACE_EXISTING);\n" +
" } catch (IOException e) {\n" +
" break;\n" +
" } finally {\n" +
" try {\n" +
" java.nio.file.Files.delete(target);\n" +
" } catch (IOException e1) {\n" +
"\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"}\n",
},
"Done");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=375248 (AIOOB with try with resources)
public void test375248b() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.File;\n" +
"import java.io.IOException;\n" +
"import java.io.InputStream;\n" +
"import java.net.MalformedURLException;\n" +
"import java.net.URL;\n" +
"import java.nio.file.Path;\n" +
"import java.nio.file.StandardCopyOption;\n" +
"\n" +
"public class X {\n" +
" public static void main(String[] args) throws Exception {\n" +
" System.out.println(\"Done\");\n" +
" }\n" +
" public void executeImports() throws MalformedURLException {\n" +
" for (int i = 0; i < 3; i++) {\n" +
" URL url = new URL(\"dummy\"); //$NON-NLS-1$\n" +
" if (url != null) {\n" +
" Path target = new File(\"dummy\").toPath();\n" +
" try (InputStream is = url.openStream()) {\n" +
" java.nio.file.Files.copy(is, target,\n" +
" StandardCopyOption.REPLACE_EXISTING);\n" +
" } catch (IOException e) {\n" +
" continue;\n" +
" } finally {\n" +
" try {\n" +
" java.nio.file.Files.delete(target);\n" +
" } catch (IOException e1) {\n" +
"\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"}\n",
},
"Done");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=375248 (AIOOB with try with resources)
public void test375248c() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.File;\n" +
"import java.io.IOException;\n" +
"import java.io.InputStream;\n" +
"import java.net.MalformedURLException;\n" +
"import java.net.URL;\n" +
"import java.nio.file.Path;\n" +
"import java.nio.file.StandardCopyOption;\n" +
"\n" +
"public class X implements AutoCloseable {\n" +
" public void foo() {\n" +
" try (X x = new X()) {\n" +
" System.out.println(\"Try\");\n" +
" throw new Exception();\n" +
" } catch (Exception e) {\n" +
" System.out.println(\"Catch\");\n"+
" return;\n" +
" } finally {\n" +
" System.out.println(\"Finally\");\n" +
" }\n" +
" }\n" +
" public void close() {\n" +
" System.out.println(\"Close\");\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
"}\n"
},
"Try\n" +
"Close\n" +
"Catch\n" +
"Finally");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=375248 (AIOOB with try with resources)
public void test375248d() {
this.runConformTest(
new String[] {
"X.java",
"import java.io.File;\n" +
"import java.io.IOException;\n" +
"import java.io.InputStream;\n" +
"import java.net.MalformedURLException;\n" +
"import java.net.URL;\n" +
"import java.nio.file.Path;\n" +
"import java.nio.file.StandardCopyOption;\n" +
"\n" +
"public class X implements AutoCloseable {\n" +
" public void foo() {\n" +
" try (X x = new X()) {\n" +
" System.out.println(\"Try\");\n" +
" } catch (Exception e) {\n" +
" System.out.println(\"Catch\");\n"+
" return;\n" +
" } finally {\n" +
" System.out.println(\"Finally\");\n" +
" return;\n" +
" }\n" +
" }\n" +
" public void close() {\n" +
" System.out.println(\"Close\");\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
"}\n"
},
"Try\n" +
"Close\n" +
"Finally");
}
public static Class testClass() {
return TryWithResourcesStatementTest.class;
}
}