一种处理checked exception的方法
在网上看到的一种处理异常的方法
public abstract class Try<V> {private Try() {}public abstract Boolean isSuccess();public abstract Boolean isFailure();public abstract void throwException();public abstract Throwable getMessage();public abstract V get();public abstract <U> Try<U> map(CheckedFunction<? super V, ? extends U> f);public abstract <U> Try<U> flatMap(CheckedFunction<? super V, Try<U>> f);public static <V> Try<V> failure(Throwable t) {Objects.requireNonNull(t);return new Failure<>(t);}public static <V> Try<V> success(V value) {Objects.requireNonNull(value);return new Success<>(value);}public static <T> Try<T> failable(CheckedSupplier<T> f) {Objects.requireNonNull(f);try {return Try.success(f.get());} catch (Throwable t) {return Try.failure(t);}}private static class Failure<V> extends Try<V> {private RuntimeException exception;public Failure(Throwable t) {super();this.exception = new RuntimeException(t);}@Overridepublic Boolean isSuccess() {return false;}@Overridepublic void throwException() {throw this.exception;}@Overridepublic V get() {throw exception;}@Overridepublic Boolean isFailure() {return true;}@Overridepublic <U> Try<U> map(CheckedFunction<? super V, ? extends U> f) {Objects.requireNonNull(f);return Try.failure(exception);}@Overridepublic <U> Try<U> flatMap(CheckedFunction<? super V, Try<U>> f) {Objects.requireNonNull(f);return Try.failure(exception);}@Overridepublic Throwable getMessage() {return exception;}}private static class Success<V> extends Try<V> {private final V value;public Success(V value) {super();this.value = value;}@Overridepublic Boolean isSuccess() {return true;}@Overridepublic void throwException() {return;}@Overridepublic V get() {return value;}@Overridepublic Boolean isFailure() {return false;}@Overridepublic <U> Try<U> map(CheckedFunction<? super V, ? extends U> f) {Objects.requireNonNull(f);try {return Try.success(f.apply(value));} catch (Throwable t) {return Try.failure(t);}}@Overridepublic <U> Try<U> flatMap(CheckedFunction<? super V, Try<U>> f) {Objects.requireNonNull(f);try {return f.apply(value);} catch (Throwable t) {return Try.failure(t);}}@Overridepublic Throwable getMessage() {throw new IllegalStateException("no messages when success");}}
}
使用样例:
Try<StringBuffer> _try = Try.failable(() -> {FileReader fileReader = new FileReader("test.txt");StringBuffer stringBuffer = new StringBuffer();int c = fileReader.read();while (c != -1) {stringBuffer.append((char) c);c = fileReader.read();}fileReader.close();return stringBuffer;});System.out.println(_try.get());
原文链接:
Why Try? Better Exception Handling in Java With Try