We can still catch and handle the specific exception by using getCause(), as seen below:
// exceptions/TurnOffChecking.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// "Turning off" Checked exceptions
import java.io.*;
class WrapCheckedException {
void throwRuntimeException(int type) {
try {
switch (type) {
case 0:
throw new FileNotFoundException();
case 1:
throw new IOException();
case 2:
throw new RuntimeException("Where am I?");
default:
return;
}
} catch (IOException | RuntimeException e) {
// Adapt to unchecked:
throw new RuntimeException(e);
}
}
}
class SomeOtherException extends Exception {}
public class TurnOffChecking {
public static void main(String[] args) {
WrapCheckedException wce = new WrapCheckedException();
// You can call throwRuntimeException() without
// a try block, and let RuntimeExceptions
// leave the method:
wce.throwRuntimeException(3); // no output
// Or you can choose to catch exceptions:
for (int i = 0; i < 4; i++) {
try {
if (i < 3) {
wce.throwRuntimeException(i);
} else {
throw new SomeOtherException();
}
} catch (SomeOtherException e) {
System.out.println("SomeOtherException: " + e);
} catch (RuntimeException re) {
try {
throw re.getCause();
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundException: " + e);
} catch (IOException e) {
System.out.println("IOException: " + e);
} catch (Throwable e) {
System.out.println("Throwable: " + e);
}
}
}
}
}
/* Output:
FileNotFoundException: java.io.FileNotFoundException
IOException: java.io.IOException
Throwable: java.lang.RuntimeException: Where am I?
SomeOtherException: SomeOtherException
*/
getCause
public Throwable getCause()
Returns the cause of this throwable or null
if the cause is nonexistent or unknown. (The cause is the throwable that caused this throwable to get thrown.)
This implementation returns the cause that was supplied via one of the constructors requiring a Throwable
, or that was set after creation with the initCause(Throwable)
method. While it is typically unnecessary to override this method, a subclass can override it to return a cause set by some other means. This is appropriate for a "legacy chained throwable" that predates the addition of chained exceptions to Throwable
. Note that it is not necessary to override any of the PrintStackTrace
methods, all of which invoke the getCause
method to determine the cause of a throwable.
Returns:
the cause of this throwable or null
if the cause is nonexistent or unknown.
Since:
1.4
references:
1. On Java 8 - Bruce Eckel
2. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/exceptions/TurnOffChecking.java
3. https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html#getCause--