exceptions - Converting Checked to Unchecked Exceptions

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangbingfengf98/article/details/88630721

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--

猜你喜欢

转载自blog.csdn.net/wangbingfengf98/article/details/88630721