1 /*
2 * Copyright (c) 1994, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.lang;
27
28 import java.io.*;
29 import java.util.*;
30
31 /**
32 * The {@code Throwable} class is the superclass of all errors and
33 * exceptions in the Java language. Only objects that are instances of this
34 * class (or one of its subclasses) are thrown by the Java Virtual Machine or
35 * can be thrown by the Java {@code throw} statement. Similarly, only
36 * this class or one of its subclasses can be the argument type in a
37 * {@code catch} clause.
38 *
39 * For the purposes of compile-time checking of exceptions, {@code
40 * Throwable} and any subclass of {@code Throwable} that is not also a
41 * subclass of either {@link RuntimeException} or {@link Error} are
42 * regarded as checked exceptions.
43 *
44 * <p>Instances of two subclasses, {@link java.lang.Error} and
45 * {@link java.lang.Exception}, are conventionally used to indicate
46 * that exceptional situations have occurred. Typically, these instances
47 * are freshly created in the context of the exceptional situation so
48 * as to include relevant information (such as stack trace data).
49 *
50 * <p>A throwable contains a snapshot of the execution stack of its
51 * thread at the time it was created. It can also contain a message
52 * string that gives more information about the error. Over time, a
53 * throwable can {@linkplain Throwable#addSuppressed suppress} other
54 * throwables from being propagated. Finally, the throwable can also
55 * contain a <i>cause</i>: another throwable that caused this
56 * throwable to be constructed. The recording of this causal information
57 * is referred to as the <i>chained exception</i> facility, as the
58 * cause can, itself, have a cause, and so on, leading to a "chain" of
59 * exceptions, each caused by another.
60 *
61 * <p>One reason that a throwable may have a cause is that the class that
62 * throws it is built atop a lower layered abstraction, and an operation on
63 * the upper layer fails due to a failure in the lower layer. It would be bad
64 * design to let the throwable thrown by the lower layer propagate outward, as
65 * it is generally unrelated to the abstraction provided by the upper layer.
66 * Further, doing so would tie the API of the upper layer to the details of
67 * its implementation, assuming the lower layer's exception was a checked
68 * exception. Throwing a "wrapped exception" (i.e., an exception containing a
69 * cause) allows the upper layer to communicate the details of the failure to
70 * its caller without incurring either of these shortcomings. It preserves
71 * the flexibility to change the implementation of the upper layer without
72 * changing its API (in particular, the set of exceptions thrown by its
73 * methods).
74 *
75 * <p>A second reason that a throwable may have a cause is that the method
76 * that throws it must conform to a general-purpose interface that does not
77 * permit the method to throw the cause directly. For example, suppose
78 * a persistent collection conforms to the {@link java.util.Collection
79 * Collection} interface, and that its persistence is implemented atop
80 * {@code java.io}. Suppose the internals of the {@code add} method
81 * can throw an {@link java.io.IOException IOException}. The implementation
82 * can communicate the details of the {@code IOException} to its caller
83 * while conforming to the {@code Collection} interface by wrapping the
84 * {@code IOException} in an appropriate unchecked exception. (The
85 * specification for the persistent collection should indicate that it is
86 * capable of throwing such exceptions.)
87 *
88 * <p>A cause can be associated with a throwable in two ways: via a
89 * constructor that takes the cause as an argument, or via the
90 * {@link #initCause(Throwable)} method. New throwable classes that
91 * wish to allow causes to be associated with them should provide constructors
92 * that take a cause and delegate (perhaps indirectly) to one of the
93 * {@code Throwable} constructors that takes a cause.
94 *
95 * Because the {@code initCause} method is public, it allows a cause to be
96 * associated with any throwable, even a "legacy throwable" whose
97 * implementation predates the addition of the exception chaining mechanism to
98 * {@code Throwable}.
99 *
100 * <p>By convention, class {@code Throwable} and its subclasses have two
101 * constructors, one that takes no arguments and one that takes a
102 * {@code String} argument that can be used to produce a detail message.
103 * Further, those subclasses that might likely have a cause associated with
104 * them should have two more constructors, one that takes a
105 * {@code Throwable} (the cause), and one that takes a
106 * {@code String} (the detail message) and a {@code Throwable} (the
107 * cause).
108 *
109 * @author unascribed
110 * @author Josh Bloch (Added exception chaining and programmatic access to
111 * stack trace in 1.4.)
112 * @jls 11.2 Compile-Time Checking of Exceptions
113 * @since 1.0
114 */
115 public class Throwable implements Serializable {
116 /** use serialVersionUID from JDK 1.0.2 for interoperability */
117 private static final long serialVersionUID = -3042686055658047285L;
118
119 /**
120 * The JVM saves some indication of the stack backtrace in this slot.
121 */
122 private transient Object backtrace;
123
124 /**
125 * Specific details about the Throwable. For example, for
126 * {@code FileNotFoundException}, this contains the name of
127 * the file that could not be found.
128 *
129 * @serial
130 */
131 private String detailMessage;
132
133
134 /**
135 * Holder class to defer initializing sentinel objects only used
136 * for serialization.
137 */
138 private static class SentinelHolder {
139 /**
140 * {@linkplain #setStackTrace(StackTraceElement[]) Setting the
141 * stack trace} to a one-element array containing this sentinel
142 * value indicates future attempts to set the stack trace will be
143 * ignored. The sentinel is equal to the result of calling:<br>
144 * {@code new StackTraceElement("", "", null, Integer.MIN_VALUE)}
145 */
146 public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL =
147 new StackTraceElement("", "", null, Integer.MIN_VALUE);
148
149 /**
150 * Sentinel value used in the serial form to indicate an immutable
151 * stack trace.
152 */
153 public static final StackTraceElement[] STACK_TRACE_SENTINEL =
154 new StackTraceElement[] {STACK_TRACE_ELEMENT_SENTINEL};
155 }
156
157 /**
158 * A shared value for an empty stack.
159 */
160 private static final StackTraceElement[] UNASSIGNED_STACK = new StackTraceElement[0];
161
162 /*
163 * To allow Throwable objects to be made immutable and safely
164 * reused by the JVM, such as OutOfMemoryErrors, fields of
165 * Throwable that are writable in response to user actions, cause,
166 * stackTrace, and suppressedExceptions obey the following
167 * protocol:
168 *
169 * 1) The fields are initialized to a non-null sentinel value
170 * which indicates the value has logically not been set.
171 *
172 * 2) Writing a null to the field indicates further writes
173 * are forbidden
174 *
175 * 3) The sentinel value may be replaced with another non-null
176 * value.
177 *
178 * For example, implementations of the HotSpot JVM have
179 * preallocated OutOfMemoryError objects to provide for better
180 * diagnosability of that situation. These objects are created
181 * without calling the constructor for that class and the fields
182 * in question are initialized to null. To support this
183 * capability, any new fields added to Throwable that require
184 * being initialized to a non-null value require a coordinated JVM
185 * change.
186 */
187
188 /**
189 * The throwable that caused this throwable to get thrown, or null if this
190 * throwable was not caused by another throwable, or if the causative
191 * throwable is unknown. If this field is equal to this throwable itself,
192 * it indicates that the cause of this throwable has not yet been
193 * initialized.
194 *
195 * @serial
196 * @since 1.4
197 */
198 private Throwable cause = this;
199
200 /**
201 * The stack trace, as returned by {@link #getStackTrace()}.
202 *
203 * The field is initialized to a zero-length array. A {@code
204 * null} value of this field indicates subsequent calls to {@link
205 * #setStackTrace(StackTraceElement[])} and {@link
206 * #fillInStackTrace()} will be no-ops.
207 *
208 * @serial
209 * @since 1.4
210 */
211 private StackTraceElement[] stackTrace = UNASSIGNED_STACK;
212
213 /**
214 * The JVM code sets the depth of the backtrace for later retrieval
215 */
216 private transient int depth;
217
218 // Setting this static field introduces an acceptable
219 // initialization dependency on a few java.util classes.
220 private static final List<Throwable> SUPPRESSED_SENTINEL = Collections.emptyList();
221
222 /**
223 * The list of suppressed exceptions, as returned by {@link
224 * #getSuppressed()}. The list is initialized to a zero-element
225 * unmodifiable sentinel list. When a serialized Throwable is
226 * read in, if the {@code suppressedExceptions} field points to a
227 * zero-element list, the field is reset to the sentinel value.
228 *
229 * @serial
230 * @since 1.7
231 */
232 private List<Throwable> suppressedExceptions = SUPPRESSED_SENTINEL;
233
234 /** Message for trying to suppress a null exception. */
235 private static final String NULL_CAUSE_MESSAGE = "Cannot suppress a null exception.";
236
237 /** Message for trying to suppress oneself. */
238 private static final String SELF_SUPPRESSION_MESSAGE = "Self-suppression not permitted";
239
240 /** Caption for labeling causative exception stack traces */
241 private static final String CAUSE_CAPTION = "Caused by: ";
242
243 /** Caption for labeling suppressed exception stack traces */
244 private static final String SUPPRESSED_CAPTION = "Suppressed: ";
245
246 /**
247 * Constructs a new throwable with {@code null} as its detail message.
248 * The cause is not initialized, and may subsequently be initialized by a
249 * call to {@link #initCause}.
250 *
251 * <p>The {@link #fillInStackTrace()} method is called to initialize
252 * the stack trace data in the newly created throwable.
253 */
254 public Throwable() {
255 fillInStackTrace();
256 }
257
258 /**
259 * Constructs a new throwable with the specified detail message. The
260 * cause is not initialized, and may subsequently be initialized by
261 * a call to {@link #initCause}.
262 *
263 * <p>The {@link #fillInStackTrace()} method is called to initialize
264 * the stack trace data in the newly created throwable.
265 *
266 * @param message the detail message. The detail message is saved for
267 * later retrieval by the {@link #getMessage()} method.
268 */
269 public Throwable(String message) {
270 fillInStackTrace();
271 detailMessage = message;
272 }
273
274 /**
275 * Constructs a new throwable with the specified detail message and
276 * cause. <p>Note that the detail message associated with
277 * {@code cause} is <i>not</i> automatically incorporated in
278 * this throwable's detail message.
279 *
280 * <p>The {@link #fillInStackTrace()} method is called to initialize
281 * the stack trace data in the newly created throwable.
282 *
283 * @param message the detail message (which is saved for later retrieval
284 * by the {@link #getMessage()} method).
285 * @param cause the cause (which is saved for later retrieval by the
286 * {@link #getCause()} method). (A {@code null} value is
287 * permitted, and indicates that the cause is nonexistent or
288 * unknown.)
289 * @since 1.4
290 */
291 public Throwable(String message, Throwable cause) {
292 fillInStackTrace();
293 detailMessage = message;
294 this.cause = cause;
295 }
296
297 /**
298 * Constructs a new throwable with the specified cause and a detail
299 * message of {@code (cause==null ? null : cause.toString())} (which
300 * typically contains the class and detail message of {@code cause}).
301 * This constructor is useful for throwables that are little more than
302 * wrappers for other throwables (for example, {@link
303 * java.security.PrivilegedActionException}).
304 *
305 * <p>The {@link #fillInStackTrace()} method is called to initialize
306 * the stack trace data in the newly created throwable.
307 *
308 * @param cause the cause (which is saved for later retrieval by the
309 * {@link #getCause()} method). (A {@code null} value is
310 * permitted, and indicates that the cause is nonexistent or
311 * unknown.)
312 * @since 1.4
313 */
314 public Throwable(Throwable cause) {
315 fillInStackTrace();
316 detailMessage = (cause==null ? null : cause.toString());
317 this.cause = cause;
318 }
319
320 /**
321 * Constructs a new throwable with the specified detail message,
322 * cause, {@linkplain #addSuppressed suppression} enabled or
323 * disabled, and writable stack trace enabled or disabled. If
324 * suppression is disabled, {@link #getSuppressed} for this object
325 * will return a zero-length array and calls to {@link
326 * #addSuppressed} that would otherwise append an exception to the
327 * suppressed list will have no effect. If the writable stack
328 * trace is false, this constructor will not call {@link
329 * #fillInStackTrace()}, a {@code null} will be written to the
330 * {@code stackTrace} field, and subsequent calls to {@code
331 * fillInStackTrace} and {@link
332 * #setStackTrace(StackTraceElement[])} will not set the stack
333 * trace. If the writable stack trace is false, {@link
334 * #getStackTrace} will return a zero length array.
335 *
336 * <p>Note that the other constructors of {@code Throwable} treat
337 * suppression as being enabled and the stack trace as being
338 * writable. Subclasses of {@code Throwable} should document any
339 * conditions under which suppression is disabled and document
340 * conditions under which the stack trace is not writable.
341 * Disabling of suppression should only occur in exceptional
342 * circumstances where special requirements exist, such as a
343 * virtual machine reusing exception objects under low-memory
344 * situations. Circumstances where a given exception object is
345 * repeatedly caught and rethrown, such as to implement control
346 * flow between two sub-systems, is another situation where
347 * immutable throwable objects would be appropriate.
348 *
349 * @param message the detail message.
350 * @param cause the cause. (A {@code null} value is permitted,
351 * and indicates that the cause is nonexistent or unknown.)
352 * @param enableSuppression whether or not suppression is enabled or disabled
353 * @param writableStackTrace whether or not the stack trace should be
354 * writable
355 *
356 * @see OutOfMemoryError
357 * @see NullPointerException
358 * @see ArithmeticException
359 * @since 1.7
360 */
361 protected Throwable(String message, Throwable cause,
362 boolean enableSuppression,
363 boolean writableStackTrace) {
364 if (writableStackTrace) {
365 fillInStackTrace();
366 } else {
367 stackTrace = null;
368 }
369 detailMessage = message;
370 this.cause = cause;
371 if (!enableSuppression)
372 suppressedExceptions = null;
373 }
374
375 /**
376 * Returns the detail message string of this throwable.
377 *
378 * @return the detail message string of this {@code Throwable} instance
379 * (which may be {@code null}).
380 */
381 public String getMessage() {
382 return detailMessage;
383 }
384
385 /**
386 * Creates a localized description of this throwable.
387 * Subclasses may override this method in order to produce a
388 * locale-specific message. For subclasses that do not override this
389 * method, the default implementation returns the same result as
390 * {@code getMessage()}.
391 *
392 * @return The localized description of this throwable.
393 * @since 1.1
394 */
395 public String getLocalizedMessage() {
396 return getMessage();
397 }
398
399 /**
400 * Returns the cause of this throwable or {@code null} if the
401 * cause is nonexistent or unknown. (The cause is the throwable that
402 * caused this throwable to get thrown.)
403 *
404 * <p>This implementation returns the cause that was supplied via one of
405 * the constructors requiring a {@code Throwable}, or that was set after
406 * creation with the {@link #initCause(Throwable)} method. While it is
407 * typically unnecessary to override this method, a subclass can override
408 * it to return a cause set by some other means. This is appropriate for
409 * a "legacy chained throwable" that predates the addition of chained
410 * exceptions to {@code Throwable}. Note that it is <i>not</i>
411 * necessary to override any of the {@code PrintStackTrace} methods,
412 * all of which invoke the {@code getCause} method to determine the
413 * cause of a throwable.
414 *
415 * @return the cause of this throwable or {@code null} if the
416 * cause is nonexistent or unknown.
417 * @since 1.4
418 */
419 public synchronized Throwable getCause() {
420 return (cause==this ? null : cause);
421 }
422
423 /**
424 * Initializes the <i>cause</i> of this throwable to the specified value.
425 * (The cause is the throwable that caused this throwable to get thrown.)
426 *
427 * <p>This method can be called at most once. It is generally called from
428 * within the constructor, or immediately after creating the
429 * throwable. If this throwable was created
430 * with {@link #Throwable(Throwable)} or
431 * {@link #Throwable(String,Throwable)}, this method cannot be called
432 * even once.
433 *
434 * <p>An example of using this method on a legacy throwable type
435 * without other support for setting the cause is:
436 *
437 * <pre>
438 * try {
439 * lowLevelOp();
440 * } catch (LowLevelException le) {
441 * throw (HighLevelException)
442 * new HighLevelException().initCause(le); // Legacy constructor
443 * }
444 * </pre>
445 *
446 * @param cause the cause (which is saved for later retrieval by the
447 * {@link #getCause()} method). (A {@code null} value is
448 * permitted, and indicates that the cause is nonexistent or
449 * unknown.)
450 * @return a reference to this {@code Throwable} instance.
451 * @throws IllegalArgumentException if {@code cause} is this
452 * throwable. (A throwable cannot be its own cause.)
453 * @throws IllegalStateException if this throwable was
454 * created with {@link #Throwable(Throwable)} or
455 * {@link #Throwable(String,Throwable)}, or this method has already
456 * been called on this throwable.
457 * @since 1.4
458 */
459 public synchronized Throwable initCause(Throwable cause) {
460 if (this.cause != this)
461 throw new IllegalStateException("Can't overwrite cause with " +
462 Objects.toString(cause, "a null"), this);
463 if (cause == this)
464 throw new IllegalArgumentException("Self-causation not permitted", this);
465 this.cause = cause;
466 return this;
467 }
468
469 /**
470 * Returns a short description of this throwable.
471 * The result is the concatenation of:
472 * <ul>
473 * <li> the {@linkplain Class#getName() name} of the class of this object
474 * <li> ": " (a colon and a space)
475 * <li> the result of invoking this object's {@link #getLocalizedMessage}
476 * method
477 * </ul>
478 * If {@code getLocalizedMessage} returns {@code null}, then just
479 * the class name is returned.
480 *
481 * @return a string representation of this throwable.
482 */
483 public String toString() {
484 String s = getClass().getName();
485 String message = getLocalizedMessage();
486 return (message != null) ? (s + ": " + message) : s;
487 }
488
489 /**
490 * Prints this throwable and its backtrace to the
491 * standard error stream. This method prints a stack trace for this
492 * {@code Throwable} object on the error output stream that is
493 * the value of the field {@code System.err}. The first line of
494 * output contains the result of the {@link #toString()} method for
495 * this object. Remaining lines represent data previously recorded by
496 * the method {@link #fillInStackTrace()}. The format of this
497 * information depends on the implementation, but the following
498 * example may be regarded as typical:
499 * <blockquote><pre>
500 * java.lang.NullPointerException
501 * at MyClass.mash(MyClass.java:9)
502 * at MyClass.crunch(MyClass.java:6)
503 * at MyClass.main(MyClass.java:3)
504 * </pre></blockquote>
505 * This example was produced by running the program:
506 * <pre>
507 * class MyClass {
508 * public static void main(String[] args) {
509 * crunch(null);
510 * }
511 * static void crunch(int[] a) {
512 * mash(a);
513 * }
514 * static void mash(int[] b) {
515 * System.out.println(b[0]);
516 * }
517 * }
518 * </pre>
519 * The backtrace for a throwable with an initialized, non-null cause
520 * should generally include the backtrace for the cause. The format
521 * of this information depends on the implementation, but the following
522 * example may be regarded as typical:
523 * <pre>
524 * HighLevelException: MidLevelException: LowLevelException
525 * at Junk.a(Junk.java:13)
526 * at Junk.main(Junk.java:4)
527 * Caused by: MidLevelException: LowLevelException
528 * at Junk.c(Junk.java:23)
529 * at Junk.b(Junk.java:17)
530 * at Junk.a(Junk.java:11)
531 * ... 1 more
532 * Caused by: LowLevelException
533 * at Junk.e(Junk.java:30)
534 * at Junk.d(Junk.java:27)
535 * at Junk.c(Junk.java:21)
536 * ... 3 more
537 * </pre>
538 * Note the presence of lines containing the characters {@code "..."}.
539 * These lines indicate that the remainder of the stack trace for this
540 * exception matches the indicated number of frames from the bottom of the
541 * stack trace of the exception that was caused by this exception (the
542 * "enclosing" exception). This shorthand can greatly reduce the length
543 * of the output in the common case where a wrapped exception is thrown
544 * from same method as the "causative exception" is caught. The above
545 * example was produced by running the program:
546 * <pre>
547 * public class Junk {
548 * public static void main(String args[]) {
549 * try {
550 * a();
551 * } catch(HighLevelException e) {
552 * e.printStackTrace();
553 * }
554 * }
555 * static void a() throws HighLevelException {
556 * try {
557 * b();
558 * } catch(MidLevelException e) {
559 * throw new HighLevelException(e);
560 * }
561 * }
562 * static void b() throws MidLevelException {
563 * c();
564 * }
565 * static void c() throws MidLevelException {
566 * try {
567 * d();
568 * } catch(LowLevelException e) {
569 * throw new MidLevelException(e);
570 * }
571 * }
572 * static void d() throws LowLevelException {
573 * e();
574 * }
575 * static void e() throws LowLevelException {
576 * throw new LowLevelException();
577 * }
578 * }
579 *
580 * class HighLevelException extends Exception {
581 * HighLevelException(Throwable cause) { super(cause); }
582 * }
583 *
584 * class MidLevelException extends Exception {
585 * MidLevelException(Throwable cause) { super(cause); }
586 * }
587 *
588 * class LowLevelException extends Exception {
589 * }
590 * </pre>
591 * As of release 7, the platform supports the notion of
592 * <i>suppressed exceptions</i> (in conjunction with the {@code
593 * try}-with-resources statement). Any exceptions that were
594 * suppressed in order to deliver an exception are printed out
595 * beneath the stack trace. The format of this information
596 * depends on the implementation, but the following example may be
597 * regarded as typical:
598 *
599 * <pre>
600 * Exception in thread "main" java.lang.Exception: Something happened
601 * at Foo.bar(Foo.java:10)
602 * at Foo.main(Foo.java:5)
603 * Suppressed: Resource$CloseFailException: Resource ID = 0
604 * at Resource.close(Resource.java:26)
605 * at Foo.bar(Foo.java:9)
606 * ... 1 more
607 * </pre>
608 * Note that the "... n more" notation is used on suppressed exceptions
609 * just at it is used on causes. Unlike causes, suppressed exceptions are
610 * indented beyond their "containing exceptions."
611 *
612 * <p>An exception can have both a cause and one or more suppressed
613 * exceptions:
614 * <pre>
615 * Exception in thread "main" java.lang.Exception: Main block
616 * at Foo3.main(Foo3.java:7)
617 * Suppressed: Resource$CloseFailException: Resource ID = 2
618 * at Resource.close(Resource.java:26)
619 * at Foo3.main(Foo3.java:5)
620 * Suppressed: Resource$CloseFailException: Resource ID = 1
621 * at Resource.close(Resource.java:26)
622 * at Foo3.main(Foo3.java:5)
623 * Caused by: java.lang.Exception: I did it
624 * at Foo3.main(Foo3.java:8)
625 * </pre>
626 * Likewise, a suppressed exception can have a cause:
627 * <pre>
628 * Exception in thread "main" java.lang.Exception: Main block
629 * at Foo4.main(Foo4.java:6)
630 * Suppressed: Resource2$CloseFailException: Resource ID = 1
631 * at Resource2.close(Resource2.java:20)
632 * at Foo4.main(Foo4.java:5)
633 * Caused by: java.lang.Exception: Rats, you caught me
634 * at Resource2$CloseFailException.<init>(Resource2.java:45)
635 * ... 2 more
636 * </pre>
637 */
638 public void printStackTrace() {
639 printStackTrace(System.err);
640 }
641
642 /**
643 * Prints this throwable and its backtrace to the specified print stream.
644 *
645 * @param s {@code PrintStream} to use for output
646 */
647 public void printStackTrace(PrintStream s) {
648 printStackTrace(new WrappedPrintStream(s));
649 }
650
651 private void printStackTrace(PrintStreamOrWriter s) {
652 // Guard against malicious overrides of Throwable.equals by
653 // using a Set with identity equality semantics.
654 Set<Throwable> dejaVu = Collections.newSetFromMap(new IdentityHashMap<>());
655 dejaVu.add(this);
656
657 synchronized (s.lock()) {
658 // Print our stack trace
659 s.println(this);
660 StackTraceElement[] trace = getOurStackTrace();
661 for (StackTraceElement traceElement : trace)
662 s.println("\tat " + traceElement);
663
664 // Print suppressed exceptions, if any
665 for (Throwable se : getSuppressed())
666 se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "\t", dejaVu);
667
668 // Print cause, if any
669 Throwable ourCause = getCause();
670 if (ourCause != null)
671 ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu);
672 }
673 }
674
675 /**
676 * Print our stack trace as an enclosed exception for the specified
677 * stack trace.
678 */
679 private void printEnclosedStackTrace(PrintStreamOrWriter s,
680 StackTraceElement[] enclosingTrace,
681 String caption,
682 String prefix,
683 Set<Throwable> dejaVu) {
684 assert Thread.holdsLock(s.lock());
685 if (dejaVu.contains(this)) {
686 s.println("\t[CIRCULAR REFERENCE:" + this + "]");
687 } else {
688 dejaVu.add(this);
689 // Compute number of frames in common between this and enclosing trace
690 StackTraceElement[] trace = getOurStackTrace();
691 int m = trace.length - 1;
692 int n = enclosingTrace.length - 1;
693 while (m >= 0 && n >=0 && trace[m].equals(enclosingTrace[n])) {
694 m--; n--;
695 }
696 int framesInCommon = trace.length - 1 - m;
697
698 // Print our stack trace
699 s.println(prefix + caption + this);
700 for (int i = 0; i <= m; i++)
701 s.println(prefix + "\tat " + trace[i]);
702 if (framesInCommon != 0)
703 s.println(prefix + "\t... " + framesInCommon + " more");
704
705 // Print suppressed exceptions, if any
706 for (Throwable se : getSuppressed())
707 se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION,
708 prefix +"\t", dejaVu);
709
710 // Print cause, if any
711 Throwable ourCause = getCause();
712 if (ourCause != null)
713 ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, prefix, dejaVu);
714 }
715 }
716
717 /**
718 * Prints this throwable and its backtrace to the specified
719 * print writer.
720 *
721 * @param s {@code PrintWriter} to use for output
722 * @since 1.1
723 */
724 public void printStackTrace(PrintWriter s) {
725 printStackTrace(new WrappedPrintWriter(s));
726 }
727
728 /**
729 * Wrapper class for PrintStream and PrintWriter to enable a single
730 * implementation of printStackTrace.
731 */
732 private abstract static class PrintStreamOrWriter {
733 /** Returns the object to be locked when using this StreamOrWriter */
734 abstract Object lock();
735
736 /** Prints the specified string as a line on this StreamOrWriter */
737 abstract void println(Object o);
738 }
739
740 private static class WrappedPrintStream extends PrintStreamOrWriter {
741 private final PrintStream printStream;
742
743 WrappedPrintStream(PrintStream printStream) {
744 this.printStream = printStream;
745 }
746
747 Object lock() {
748 return printStream;
749 }
750
751 void println(Object o) {
752 printStream.println(o);
753 }
754 }
755
756 private static class WrappedPrintWriter extends PrintStreamOrWriter {
757 private final PrintWriter printWriter;
758
759 WrappedPrintWriter(PrintWriter printWriter) {
760 this.printWriter = printWriter;
761 }
762
763 Object lock() {
764 return printWriter;
765 }
766
767 void println(Object o) {
768 printWriter.println(o);
769 }
770 }
771
772 /**
773 * Fills in the execution stack trace. This method records within this
774 * {@code Throwable} object information about the current state of
775 * the stack frames for the current thread.
776 *
777 * <p>If the stack trace of this {@code Throwable} {@linkplain
778 * Throwable#Throwable(String, Throwable, boolean, boolean) is not
779 * writable}, calling this method has no effect.
780 *
781 * @return a reference to this {@code Throwable} instance.
782 * @see java.lang.Throwable#printStackTrace()
783 */
784 public synchronized Throwable fillInStackTrace() {
785 if (stackTrace != null ||
786 backtrace != null /* Out of protocol state */ ) {
787 fillInStackTrace(0);
788 stackTrace = UNASSIGNED_STACK;
789 }
790 return this;
791 }
792
793 private native Throwable fillInStackTrace(int dummy);
794
795 /**
796 * Provides programmatic access to the stack trace information printed by
797 * {@link #printStackTrace()}. Returns an array of stack trace elements,
798 * each representing one stack frame. The zeroth element of the array
799 * (assuming the array's length is non-zero) represents the top of the
800 * stack, which is the last method invocation in the sequence. Typically,
801 * this is the point at which this throwable was created and thrown.
802 * The last element of the array (assuming the array's length is non-zero)
803 * represents the bottom of the stack, which is the first method invocation
804 * in the sequence.
805 *
806 * <p>Some virtual machines may, under some circumstances, omit one
807 * or more stack frames from the stack trace. In the extreme case,
808 * a virtual machine that has no stack trace information concerning
809 * this throwable is permitted to return a zero-length array from this
810 * method. Generally speaking, the array returned by this method will
811 * contain one element for every frame that would be printed by
812 * {@code printStackTrace}. Writes to the returned array do not
813 * affect future calls to this method.
814 *
815 * @return an array of stack trace elements representing the stack trace
816 * pertaining to this throwable.
817 * @since 1.4
818 */
819 public StackTraceElement[] getStackTrace() {
820 return getOurStackTrace().clone();
821 }
822
823 private synchronized StackTraceElement[] getOurStackTrace() {
824 // Initialize stack trace field with information from
825 // backtrace if this is the first call to this method
826 if (stackTrace == UNASSIGNED_STACK ||
827 (stackTrace == null && backtrace != null) /* Out of protocol state */) {
828 stackTrace = StackTraceElement.of(this, depth);
829 } else if (stackTrace == null) {
830 return UNASSIGNED_STACK;
831 }
832 return stackTrace;
833 }
834
835 /**
836 * Sets the stack trace elements that will be returned by
837 * {@link #getStackTrace()} and printed by {@link #printStackTrace()}
838 * and related methods.
839 *
840 * This method, which is designed for use by RPC frameworks and other
841 * advanced systems, allows the client to override the default
842 * stack trace that is either generated by {@link #fillInStackTrace()}
843 * when a throwable is constructed or deserialized when a throwable is
844 * read from a serialization stream.
845 *
846 * <p>If the stack trace of this {@code Throwable} {@linkplain
847 * Throwable#Throwable(String, Throwable, boolean, boolean) is not
848 * writable}, calling this method has no effect other than
849 * validating its argument.
850 *
851 * @param stackTrace the stack trace elements to be associated with
852 * this {@code Throwable}. The specified array is copied by this
853 * call; changes in the specified array after the method invocation
854 * returns will have no affect on this {@code Throwable}'s stack
855 * trace.
856 *
857 * @throws NullPointerException if {@code stackTrace} is
858 * {@code null} or if any of the elements of
859 * {@code stackTrace} are {@code null}
860 *
861 * @since 1.4
862 */
863 public void setStackTrace(StackTraceElement[] stackTrace) {
864 // Validate argument
865 StackTraceElement[] defensiveCopy = stackTrace.clone();
866 for (int i = 0; i < defensiveCopy.length; i++) {
867 if (defensiveCopy[i] == null)
868 throw new NullPointerException("stackTrace[" + i + "]");
869 }
870
871 synchronized (this) {
872 if (this.stackTrace == null && // Immutable stack
873 backtrace == null) // Test for out of protocol state
874 return;
875 this.stackTrace = defensiveCopy;
876 }
877 }
878
879 /**
880 * Reads a {@code Throwable} from a stream, enforcing
881 * well-formedness constraints on fields. Null entries and
882 * self-pointers are not allowed in the list of {@code
883 * suppressedExceptions}. Null entries are not allowed for stack
884 * trace elements. A null stack trace in the serial form results
885 * in a zero-length stack element array. A single-element stack
886 * trace whose entry is equal to {@code new StackTraceElement("",
887 * "", null, Integer.MIN_VALUE)} results in a {@code null} {@code
888 * stackTrace} field.
889 *
890 * Note that there are no constraints on the value the {@code
891 * cause} field can hold; both {@code null} and {@code this} are
892 * valid values for the field.
893 */
894 private void readObject(ObjectInputStream s)
895 throws IOException, ClassNotFoundException {
896 s.defaultReadObject(); // read in all fields
897
898 // Set suppressed exceptions and stack trace elements fields
899 // to marker values until the contents from the serial stream
900 // are validated.
901 List<Throwable> candidateSuppressedExceptions = suppressedExceptions;
902 suppressedExceptions = SUPPRESSED_SENTINEL;
903
904 StackTraceElement[] candidateStackTrace = stackTrace;
905 stackTrace = UNASSIGNED_STACK.clone();
906
907 if (candidateSuppressedExceptions != null) {
908 int suppressedSize = validateSuppressedExceptionsList(candidateSuppressedExceptions);
909 if (suppressedSize > 0) { // Copy valid Throwables to new list
910 var suppList = new ArrayList<Throwable>(Math.min(100, suppressedSize));
911
912 for (Throwable t : candidateSuppressedExceptions) {
913 // Enforce constraints on suppressed exceptions in
914 // case of corrupt or malicious stream.
915 if (t == null)
916 throw new NullPointerException(NULL_CAUSE_MESSAGE);
917 if (t == this)
918 throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE);
919 suppList.add(t);
920 }
921 // If there are any invalid suppressed exceptions,
922 // implicitly use the sentinel value assigned earlier.
923 suppressedExceptions = suppList;
924 }
925 } else {
926 suppressedExceptions = null;
927 }
928
929 /*
930 * For zero-length stack traces, use a clone of
931 * UNASSIGNED_STACK rather than UNASSIGNED_STACK itself to
932 * allow identity comparison against UNASSIGNED_STACK in
933 * getOurStackTrace. The identity of UNASSIGNED_STACK in
934 * stackTrace indicates to the getOurStackTrace method that
935 * the stackTrace needs to be constructed from the information
936 * in backtrace.
937 */
938 if (candidateStackTrace != null) {
939 // Work from a clone of the candidateStackTrace to ensure
940 // consistency of checks.
941 candidateStackTrace = candidateStackTrace.clone();
942 if (candidateStackTrace.length >= 1) {
943 if (candidateStackTrace.length == 1 &&
944 // Check for the marker of an immutable stack trace
945 SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL.equals(candidateStackTrace[0])) {
946 stackTrace = null;
947 } else { // Verify stack trace elements are non-null.
948 for (StackTraceElement ste : candidateStackTrace) {
949 if (ste == null)
950 throw new NullPointerException("null StackTraceElement in serial stream.");
951 }
952 stackTrace = candidateStackTrace;
953 }
954 }
955 }
956 // A null stackTrace field in the serial form can result from
957 // an exception serialized without that field in older JDK
958 // releases; treat such exceptions as having empty stack
959 // traces by leaving stackTrace assigned to a clone of
960 // UNASSIGNED_STACK.
961 }
962
963 private int validateSuppressedExceptionsList(List<Throwable> deserSuppressedExceptions)
964 throws IOException {
965 if (!Object.class.getModule().
966 equals(deserSuppressedExceptions.getClass().getModule())) {
967 throw new StreamCorruptedException("List implementation not in base module.");
968 } else {
969 int size = deserSuppressedExceptions.size();
970 if (size < 0) {
971 throw new StreamCorruptedException("Negative list size reported.");
972 }
973 return size;
974 }
975 }
976
977 /**
978 * Write a {@code Throwable} object to a stream.
979 *
980 * A {@code null} stack trace field is represented in the serial
981 * form as a one-element array whose element is equal to {@code
982 * new StackTraceElement("", "", null, Integer.MIN_VALUE)}.
983 */
984 private synchronized void writeObject(ObjectOutputStream s)
985 throws IOException {
986 // Ensure that the stackTrace field is initialized to a
987 // non-null value, if appropriate. As of JDK 7, a null stack
988 // trace field is a valid value indicating the stack trace
989 // should not be set.
990 getOurStackTrace();
991
992 StackTraceElement[] oldStackTrace = stackTrace;
993 try {
994 if (stackTrace == null)
995 stackTrace = SentinelHolder.STACK_TRACE_SENTINEL;
996 s.defaultWriteObject();
997 } finally {
998 stackTrace = oldStackTrace;
999 }
1000 }
1001
1002 /**
1003 * Appends the specified exception to the exceptions that were
1004 * suppressed in order to deliver this exception. This method is
1005 * thread-safe and typically called (automatically and implicitly)
1006 * by the {@code try}-with-resources statement.
1007 *
1008 * <p>The suppression behavior is enabled <em>unless</em> disabled
1009 * {@linkplain #Throwable(String, Throwable, boolean, boolean) via
1010 * a constructor}. When suppression is disabled, this method does
1011 * nothing other than to validate its argument.
1012 *
1013 * <p>Note that when one exception {@linkplain
1014 * #initCause(Throwable) causes} another exception, the first
1015 * exception is usually caught and then the second exception is
1016 * thrown in response. In other words, there is a causal
1017 * connection between the two exceptions.
1018 *
1019 * In contrast, there are situations where two independent
1020 * exceptions can be thrown in sibling code blocks, in particular
1021 * in the {@code try} block of a {@code try}-with-resources
1022 * statement and the compiler-generated {@code finally} block
1023 * which closes the resource.
1024 *
1025 * In these situations, only one of the thrown exceptions can be
1026 * propagated. In the {@code try}-with-resources statement, when
1027 * there are two such exceptions, the exception originating from
1028 * the {@code try} block is propagated and the exception from the
1029 * {@code finally} block is added to the list of exceptions
1030 * suppressed by the exception from the {@code try} block. As an
1031 * exception unwinds the stack, it can accumulate multiple
1032 * suppressed exceptions.
1033 *
1034 * <p>An exception may have suppressed exceptions while also being
1035 * caused by another exception. Whether or not an exception has a
1036 * cause is semantically known at the time of its creation, unlike
1037 * whether or not an exception will suppress other exceptions
1038 * which is typically only determined after an exception is
1039 * thrown.
1040 *
1041 * <p>Note that programmer written code is also able to take
1042 * advantage of calling this method in situations where there are
1043 * multiple sibling exceptions and only one can be propagated.
1044 *
1045 * @param exception the exception to be added to the list of
1046 * suppressed exceptions
1047 * @throws IllegalArgumentException if {@code exception} is this
1048 * throwable; a throwable cannot suppress itself.
1049 * @throws NullPointerException if {@code exception} is {@code null}
1050 * @since 1.7
1051 */
1052 public final synchronized void addSuppressed(Throwable exception) {
1053 if (exception == this)
1054 throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE, exception);
1055
1056 if (exception == null)
1057 throw new NullPointerException(NULL_CAUSE_MESSAGE);
1058
1059 if (suppressedExceptions == null) // Suppressed exceptions not recorded
1060 return;
1061
1062 if (suppressedExceptions == SUPPRESSED_SENTINEL)
1063 suppressedExceptions = new ArrayList<>(1);
1064
1065 suppressedExceptions.add(exception);
1066 }
1067
1068 private static final Throwable[] EMPTY_THROWABLE_ARRAY = new Throwable[0];
1069
1070 /**
1071 * Returns an array containing all of the exceptions that were
1072 * suppressed, typically by the {@code try}-with-resources
1073 * statement, in order to deliver this exception.
1074 *
1075 * If no exceptions were suppressed or {@linkplain
1076 * #Throwable(String, Throwable, boolean, boolean) suppression is
1077 * disabled}, an empty array is returned. This method is
1078 * thread-safe. Writes to the returned array do not affect future
1079 * calls to this method.
1080 *
1081 * @return an array containing all of the exceptions that were
1082 * suppressed to deliver this exception.
1083 * @since 1.7
1084 */
1085 public final synchronized Throwable[] getSuppressed() {
1086 if (suppressedExceptions == SUPPRESSED_SENTINEL ||
1087 suppressedExceptions == null)
1088 return EMPTY_THROWABLE_ARRAY;
1089 else
1090 return suppressedExceptions.toArray(EMPTY_THROWABLE_ARRAY);
1091 }
1092 }
1093