Top Description Fields Constructors Methods
com.google.common.base

public final Class Throwables

extends Object
Class Inheritance
Annotations
@GwtCompatible
emulated:true
@ElementTypesAreNonnullByDefault
Static Imports
com.google.common.base.Preconditions.checkNotNull, java.util.Arrays.asList, .Collections.unmodifiableList, .Objects.requireNonNull

Static utility methods pertaining to instances of Throwable.

See the Guava User Guide entry on Throwables.

Authors
Kevin Bourrillion, Ben Yu
Since
1.0

Field Summary

Modifier and TypeField and Description
private static final Method
getStackTraceDepthMethod

The "getStackTraceDepth" method, only available on some JDKs so we use reflection to find it when available.

private static final Method
getStackTraceElementMethod

The "getStackTraceElementMethod" method, only available on some JDKs so we use reflection to find it when available.

private static final String
JAVA_LANG_ACCESS_CLASSNAME

JavaLangAccess class name to load using reflection

private static final Object
jla

Access to some fancy internal JVM internals.

pack-priv static final String
SHARED_SECRETS_CLASSNAME

SharedSecrets class name to load using reflection

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
public static List<Throwable>

Returns:

an unmodifiable list containing the cause chain starting with throwable
getCausalChain
(Throwable
the non-null Throwable to extract causes from
throwable
)

Gets a Throwable cause chain as a list.

public static <X extends Throwable> X
getCauseAs(Throwable throwable, Class<X> expectedCauseType)

Returns throwable's cause, cast to expectedCauseType.

private static Method
getGetMethod()

Returns the Method that can be used to resolve an individual StackTraceElement, or null if that method cannot be found (it is only to be found in fairly recent JDKs).

private static Object
getJLA()

Returns the JavaLangAccess class that is present in all Sun JDKs.

private static Method
getJlaMethod(String name, Class<?>... parameterTypes)

public static Throwable
getRootCause(Throwable throwable)

Returns the innermost cause of throwable.

private static Method
getSizeMethod(Object jla)

Returns the Method that can be used to return the size of a stack, or null if that method cannot be found (it is only to be found in fairly recent JDKs).

public static String
getStackTraceAsString(Throwable throwable)

Returns a string containing the result of toString(), followed by the full, recursive stack trace of throwable.

private static Object
private static List<StackTraceElement>
public static List<StackTraceElement>
lazyStackTrace(Throwable throwable)

Deprecated This method is equivalent to Throwable#getStackTrace() on JDK versions past JDK 8 and on all Android versions.
Returns the stack trace of throwable, possibly providing slower iteration over the full trace but faster iteration over parts of the trace.
public static boolean
lazyStackTraceIsLazy()

Deprecated This method always returns false on JDK versions past JDK 8 and on all Android versions.
Returns whether lazyStackTrace will use the special implementation described in its documentation.
public static RuntimeException

Returns:

nothing will ever be returned; this return type is only for your convenience, as illustrated in the example above
propagate
(Throwable
the Throwable to propagate
throwable
)

Deprecated To preserve behavior, use throw e or throw new RuntimeException(e) directly, or use a combination of throwIfUnchecked and throw new RuntimeException(e).
Propagates throwable as-is if it is an instance of RuntimeException or Error, or else as a last resort, wraps it in a RuntimeException and then propagates.
public static <X extends Throwable> void
propagateIfInstanceOf(Throwable throwable, Class<X> declaredType)

Deprecated Use throwIfInstanceOf, which has the same behavior but rejects null.
Propagates throwable exactly as-is, if and only if it is an instance of declaredType.
public static void
propagateIfPossible(Throwable throwable)

Deprecated Use throwIfUnchecked, which has the same behavior but rejects null.
Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException or Error.
public static <X extends Throwable> void
propagateIfPossible(Throwable
the Throwable to possibly propagate
throwable
,
Class<X>
the single checked exception type declared by the calling method
declaredType
)

Deprecated Use a combination of throwIfInstanceOf and throwIfUnchecked, which togther provide the same behavior except that they reject null.
Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException, Error, or declaredType.
public static <X1 extends Throwable, X2 extends Throwable> void
propagateIfPossible(Throwable
the Throwable to possibly propagate
throwable
,
Class<X1>
any checked exception type declared by the calling method
declaredType1
,
Class<X2>
any other checked exception type declared by the calling method
declaredType2
)

Deprecated Use a combination of two calls to throwIfInstanceOf and one call to throwIfUnchecked, which togther provide the same behavior except that they reject null.
Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException, Error, declaredType1, or declaredType2.
public static <X extends Throwable> void
throwIfInstanceOf(Throwable throwable, Class<X> declaredType)

Throws throwable if it is an instance of declaredType.

public static void
throwIfUnchecked(Throwable throwable)

Throws throwable if it is a RuntimeException or Error.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

getStackTraceDepthMethodback to summary
private static final Method getStackTraceDepthMethod

The "getStackTraceDepth" method, only available on some JDKs so we use reflection to find it when available. When this is null, use the slow way.

Annotations
@J2ktIncompatible
@GwtIncompatible
@CheckForNull
getStackTraceElementMethodback to summary
private static final Method getStackTraceElementMethod

The "getStackTraceElementMethod" method, only available on some JDKs so we use reflection to find it when available. When this is null, use the slow way.

Annotations
@J2ktIncompatible
@GwtIncompatible
@CheckForNull
JAVA_LANG_ACCESS_CLASSNAMEback to summary
private static final String JAVA_LANG_ACCESS_CLASSNAME

JavaLangAccess class name to load using reflection

Annotations
@J2ktIncompatible
@GwtIncompatible
jlaback to summary
private static final Object jla

Access to some fancy internal JVM internals.

Annotations
@J2ktIncompatible
@GwtIncompatible
@CheckForNull
SHARED_SECRETS_CLASSNAMEback to summary
pack-priv static final String SHARED_SECRETS_CLASSNAME

SharedSecrets class name to load using reflection

Annotations
@J2ktIncompatible
@GwtIncompatible
@VisibleForTesting

Constructor Detail

Throwablesback to summary
private Throwables()

Method Detail

getCausalChainback to summary
public static List<Throwable> getCausalChain(Throwable throwable)

Gets a Throwable cause chain as a list. The first entry in the list will be throwable followed by its cause hierarchy. Note that this is a snapshot of the cause chain and will not reflect any subsequent changes to the cause chain.

Here's an example of how it can be used to find specific types of exceptions in the cause chain:

Iterables.filter(Throwables.getCausalChain(e), IOException.class));
Parameters
throwable:Throwable

the non-null Throwable to extract causes from

Returns:List<Throwable>

an unmodifiable list containing the cause chain starting with throwable

Exceptions
IllegalArgumentException:
if there is a loop in the causal chain
getCauseAsback to summary
public static <X extends Throwable> X getCauseAs(Throwable throwable, Class<X> expectedCauseType)

Returns throwable's cause, cast to expectedCauseType.

Prefer this method instead of manually casting an exception's cause. For example, (IOException) e.getCause() throws a ClassCastException that discards the original exception e if the cause is not an IOException, but Throwables.getCauseAs(e, IOException.class) keeps e as the ClassCastException's cause.

Annotations
@GwtIncompatible
@CheckForNull
Exceptions
ClassCastException:
if the cause cannot be cast to the expected type. The ClassCastException's cause is throwable.
Since
22.0
getGetMethodback to summary
private static Method getGetMethod()

Returns the Method that can be used to resolve an individual StackTraceElement, or null if that method cannot be found (it is only to be found in fairly recent JDKs).

Annotations
@J2ktIncompatible
@GwtIncompatible
@CheckForNull
getJLAback to summary
private static Object getJLA()

Returns the JavaLangAccess class that is present in all Sun JDKs. It is not allowed in AppEngine, and not present in non-Sun JDKs.

Annotations
@SuppressWarnings:removal
@J2ktIncompatible
@GwtIncompatible
@CheckForNull
getJlaMethodback to summary
private static Method getJlaMethod(String name, Class<?>... parameterTypes) throws ThreadDeath
Annotations
@SuppressWarnings:removal
@J2ktIncompatible
@GwtIncompatible
@CheckForNull
getRootCauseback to summary
public static Throwable getRootCause(Throwable throwable)

Returns the innermost cause of throwable. The first throwable in a chain provides context from when the error or exception was initially detected. Example usage:

assertEquals("Unable to assign a customer id", Throwables.getRootCause(e).getMessage());
Exceptions
IllegalArgumentException:
if there is a loop in the causal chain
getSizeMethodback to summary
private static Method getSizeMethod(Object jla)

Returns the Method that can be used to return the size of a stack, or null if that method cannot be found (it is only to be found in fairly recent JDKs). Tries to test method getStackTraceDepth prior to return it (might fail some JDKs).

See Throwables#lazyStackTrace throws UnsupportedOperationException.

Annotations
@J2ktIncompatible
@GwtIncompatible
@CheckForNull
getStackTraceAsStringback to summary
public static String getStackTraceAsString(Throwable throwable)

Returns a string containing the result of toString(), followed by the full, recursive stack trace of throwable. Note that you probably should not be parsing the resulting string; if you need programmatic access to the stack frames, you can call Throwable#getStackTrace().

Annotations
@GwtIncompatible
invokeAccessibleNonThrowingMethodback to summary
private static Object invokeAccessibleNonThrowingMethod(Method method, Object receiver, Object... params)
Annotations
@J2ktIncompatible
@GwtIncompatible
jlaStackTraceback to summary
private static List<StackTraceElement> jlaStackTrace(Throwable t)
Annotations
@J2ktIncompatible
@GwtIncompatible
lazyStackTraceback to summary
public static List<StackTraceElement> lazyStackTrace(Throwable throwable)

Deprecated

This method is equivalent to Throwable#getStackTrace() on JDK versions past JDK 8 and on all Android versions. Use Throwable#getStackTrace() directly, or where possible use the java.lang.StackWalker.walk method introduced in JDK 9.

Returns the stack trace of throwable, possibly providing slower iteration over the full trace but faster iteration over parts of the trace. Here, "slower" and "faster" are defined in comparison to the normal way to access the stack trace, throwable.getStackTrace(). Note, however, that this method's special implementation is not available for all platforms and configurations. If that implementation is unavailable, this method falls back to getStackTrace. Callers that require the special implementation can check its availability with lazyStackTraceIsLazy().

The expected (but not guaranteed) performance of the special implementation differs from getStackTrace in one main way: The lazyStackTrace call itself returns quickly by delaying the per-stack-frame work until each element is accessed. Roughly speaking:

  • getStackTrace takes stackSize time to return but then negligible time to retrieve each element of the returned list.
  • lazyStackTrace takes negligible time to return but then 1/stackSize time to retrieve each element of the returned list (probably slightly more than 1/stackSize).

Note

The special implementation does not respect calls to throwable.setStackTrace. Instead, it always reflects the original stack trace from the exception's creation.

Annotations
@Deprecated
@J2ktIncompatible
@GwtIncompatible
Since
19.0
lazyStackTraceIsLazyback to summary
public static boolean lazyStackTraceIsLazy()

Deprecated

This method always returns false on JDK versions past JDK 8 and on all Android versions.

Returns whether lazyStackTrace will use the special implementation described in its documentation.

Annotations
@Deprecated
@J2ktIncompatible
@GwtIncompatible
Since
19.0
propagateback to summary
public static RuntimeException propagate(Throwable throwable)

Deprecated

To preserve behavior, use throw e or throw new RuntimeException(e) directly, or use a combination of throwIfUnchecked and throw new RuntimeException(e). But consider whether users would be better off if your API threw a different type of exception. For background on the deprecation, read Why we deprecated Throwables.propagate.

Propagates throwable as-is if it is an instance of RuntimeException or Error, or else as a last resort, wraps it in a RuntimeException and then propagates.

This method always throws an exception. The RuntimeException return type allows client code to signal to the compiler that statements after the call are unreachable. Example usage:

T doSomething() {
  try {
    return someMethodThatCouldThrowAnything();
  } catch (IKnowWhatToDoWithThisException e) {
    return handle(e);
  } catch (Throwable t) {
    throw Throwables.propagate(t);
  }
}
Parameters
throwable:Throwable

the Throwable to propagate

Returns:RuntimeException

nothing will ever be returned; this return type is only for your convenience, as illustrated in the example above

Annotations
@CanIgnoreReturnValue
@J2ktIncompatible
@GwtIncompatible
@Deprecated
propagateIfInstanceOfback to summary
public static <X extends Throwable> void propagateIfInstanceOf(Throwable throwable, Class<X> declaredType) throws Class-:X

Deprecated

Use throwIfInstanceOf, which has the same behavior but rejects null.

Propagates throwable exactly as-is, if and only if it is an instance of declaredType. Example usage:

try {
  someMethodThatCouldThrowAnything();
} catch (IKnowWhatToDoWithThisException e) {
  handle(e);
} catch (Throwable t) {
  Throwables.propagateIfInstanceOf(t, IOException.class);
  Throwables.propagateIfInstanceOf(t, SQLException.class);
  throw Throwables.propagate(t);
}
Annotations
@Deprecated
@J2ktIncompatible
@GwtIncompatible
propagateIfPossibleback to summary
public static void propagateIfPossible(Throwable throwable)

Deprecated

Use throwIfUnchecked, which has the same behavior but rejects null.

Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException or Error.

Annotations
@Deprecated
@J2ktIncompatible
@GwtIncompatible
propagateIfPossibleback to summary
public static <X extends Throwable> void propagateIfPossible(Throwable throwable, Class<X> declaredType) throws Class-:X

Deprecated

Use a combination of throwIfInstanceOf and throwIfUnchecked, which togther provide the same behavior except that they reject null.

Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException, Error, or declaredType.

Discouraged in favor of calling throwIfInstanceOf and throwIfUnchecked.

Parameters
throwable:Throwable

the Throwable to possibly propagate

declaredType:Class<X>

the single checked exception type declared by the calling method

Annotations
@Deprecated
@J2ktIncompatible
@GwtIncompatible
propagateIfPossibleback to summary
public static <X1 extends Throwable, X2 extends Throwable> void propagateIfPossible(Throwable throwable, Class<X1> declaredType1, Class<X2> declaredType2) throws Class-:X1, Class-:X2

Deprecated

Use a combination of two calls to throwIfInstanceOf and one call to throwIfUnchecked, which togther provide the same behavior except that they reject null.

Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException, Error, declaredType1, or declaredType2.

Parameters
throwable:Throwable

the Throwable to possibly propagate

declaredType1:Class<X1>

any checked exception type declared by the calling method

declaredType2:Class<X2>

any other checked exception type declared by the calling method

Annotations
@Deprecated
@J2ktIncompatible
@GwtIncompatible
throwIfInstanceOfback to summary
public static <X extends Throwable> void throwIfInstanceOf(Throwable throwable, Class<X> declaredType) throws Class-:X

Throws throwable if it is an instance of declaredType. Example usage:

for (Foo foo : foos) {
  try {
    foo.bar();
  } catch (BarException | RuntimeException | Error t) {
    failure = t;
  }
}
if (failure != null) {
  throwIfInstanceOf(failure, BarException.class);
  throwIfUnchecked(failure);
  throw new AssertionError(failure);
}
Annotations
@GwtIncompatible
Since
20.0
throwIfUncheckedback to summary
public static void throwIfUnchecked(Throwable throwable)

Throws throwable if it is a RuntimeException or Error. Example usage:

for (Foo foo : foos) {
  try {
    foo.bar();
  } catch (RuntimeException | Error t) {
    failure = t;
  }
}
if (failure != null) {
  throwIfUnchecked(failure);
  throw new AssertionError(failure);
}
Since
20.0