blob: a6577ba469382f524c0e8c800296db3cced7fba9 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * @test /nodynamiccopyright/
3 * @bug 4209652 4363318
4 * @summary Basic test for chained exceptions & Exception.getStackTrace().
5 * @author Josh Bloch
6 */
7
8public class ChainedExceptions {
9 public static void main(String args[]) {
10 try {
11 a();
12 } catch(HighLevelException e) {
13 StackTraceElement[] highTrace = e.getStackTrace();
14 int depthTrim = highTrace.length - 2;
15
16 check(highTrace[0], "a", 48);
17 check(highTrace[1], "main", 11);
18
19 Throwable mid = e.getCause();
20 StackTraceElement[] midTrace = mid.getStackTrace();
21 if (midTrace.length - depthTrim != 4)
22 throw new RuntimeException("Mid depth");
23 check(midTrace[0], "c", 58);
24 check(midTrace[1], "b", 52);
25 check(midTrace[2], "a", 46);
26 check(midTrace[3], "main", 11);
27
28 Throwable low = mid.getCause();
29 StackTraceElement[] lowTrace = low.getStackTrace();
30 if (lowTrace.length - depthTrim != 6)
31 throw new RuntimeException("Low depth");
32 check(lowTrace[0], "e", 65);
33 check(lowTrace[1], "d", 62);
34 check(lowTrace[2], "c", 56);
35 check(lowTrace[3], "b", 52);
36 check(lowTrace[4], "a", 46);
37 check(lowTrace[5], "main", 11);
38
39 if (low.getCause() != null)
40 throw new RuntimeException("Low cause != null");
41 }
42 }
43
44 static void a() throws HighLevelException {
45 try {
46 b();
47 } catch(MidLevelException e) {
48 throw new HighLevelException(e);
49 }
50 }
51 static void b() throws MidLevelException {
52 c();
53 }
54 static void c() throws MidLevelException {
55 try {
56 d();
57 } catch(LowLevelException e) {
58 throw new MidLevelException(e);
59 }
60 }
61 static void d() throws LowLevelException {
62 e();
63 }
64 static void e() throws LowLevelException {
65 throw new LowLevelException();
66 }
67
68 private static final String OUR_CLASS = ChainedExceptions.class.getName();
69 private static final String OUR_FILE_NAME = "ChainedExceptions.java";
70
71 private static void check(StackTraceElement e, String methodName, int n) {
72 if (!e.getClassName().equals(OUR_CLASS))
73 throw new RuntimeException("Class: " + e);
74 if (!e.getMethodName().equals(methodName))
75 throw new RuntimeException("Method name: " + e);
76 if (!e.getFileName().equals(OUR_FILE_NAME))
77 throw new RuntimeException("File name: " + e);
78 if (e.getLineNumber() != n)
79 throw new RuntimeException("Line number: " + e);
80 }
81}
82
83class HighLevelException extends Exception {
84 HighLevelException(Throwable cause) { super(cause); }
85}
86
87class MidLevelException extends Exception {
88 MidLevelException(Throwable cause) { super(cause); }
89}
90
91class LowLevelException extends Exception {
92}