class C {
static class E extends Exception { }
static class E1 extends E { }
static class E2 extends E { }
static class Err extends Error { }
void m0() {
try {
throw new E1();
}
catch (Exception e) {
try {
// throws E1 in JDK7
throw e;
} catch (E2 e2) { }
}
}
void m1() throws E1 {
try {
throw new E1();
}
catch (Exception e) {
try {
// throws E1 in JDK7
throw e;
} catch (E2 e2) { }
}
}
void m2() {
try {
throw new E1();
}
catch (Exception e) {
try {
if (true) {
throw e;
}
e = new E1(); // analysis disabled, even by late assignment
}
catch (E2 e2) { }
}
}
void m3(boolean f) throws E1, E2 {
try {
if (f)
throw new E1();
else
throw new E2();
}
catch (Exception e) {
// read access doesn't disables an analysis
System.out.println(e);
// throws E1, E2 in JDK7
throw e;
}
}
void m4(boolean f) throws E1, E2 {
try {
if (f)
throw new E1();
else
throw new E2();
}
catch (Exception e) {
e = new E2(); // analysis disabled
throw e;
}
}
void m5(boolean f) throws E {
try {
if (f)
throw new E1();
else if (!f)
throw new E2();
else
throw (Throwable)new E();
}
catch (E1 e1) { }
catch (final Exception e) {
// Throwable isn't a subtype of Exception
throw e;
}
catch (Throwable t) { }
}
void m6(boolean f) throws E2 {
try {
if (f)
throw new E1();
else if (!f)
throw new E2();
}
catch (E1 e1) { }
catch (final Exception e) {
throw e;
}
}
void m7() {
try {
if (true)
throw new E1();
else if (false)
throw new E2();
}
catch (E e) {
// throws E1, E2 in JDK7
throw e;
}
}
void m8() throws E1 {
try {
if (true)
throw new E1();
else if (false)
throw new E2();
}
catch (E1 | E2 e) {
throw e;
}
}
void m9() {
try {
throw new E1();
}
catch (E x) {
try {
throw x;
}
catch (E y) {
try {
throw y;
}
catch (E z) {
// chained exception type evaluation
throw z;
}
}
}
}
void m10() {
try {
throw new E1();
}
catch (E e) {
E x = e;
// no chained exception type evaluation
throw x;
}
}
void m11_1() {
try {
System.out.println();
}
catch (Exception e) {
throw e;
}
}
void m11_2() {
try {
System.out.println();
}
catch (Error e) {
throw e;
}
}
void m11_3() {
try {
System.out.println();
}
catch (Err e) {
throw e;
}
}
void m11_4() {
try {
if (false) throw new RuntimeException();
}
catch (Exception e) {
throw e;
}
}
static class MyResource implements AutoCloseable {
public void close() throws E1 { }
}
MyResource getResource() throws E2 {
return null;
}
void m12() {
try (MyResource r = getResource()) {
System.out.println(r);
}
catch (Exception e) {
// test for another precise types calculation fix
throw e;
}
}
void m13() throws E1 {
try {
try {
if (true)
throw new E1();
else if (false)
throw new E2();
}
catch (E1 | E2 e) {
throw e;
}
}
catch (E2 e) {
throw new RuntimeException(e);
}
}
}