簡體   English   中英

在lambda中拋出Catch RuntimeException並將其重新拋出為checked

[英]Catch RuntimeException thrown in a lambda and rethrow it as checked

我試圖找出為什么我的代碼拋出IllegalStateException ,而不是我的自定義,我希望它拋出。

public final class CollectorUtils {
    private CollectorUtils() {
        throw new UnsupportedOperationException();
    }

    public static <E, R, X extends Throwable> Collector<E, ?, R> listAndThenCollector(final Predicate<List<E>> listPredicate, final Function<List<E>, R> listFunction, final Function<Throwable, X> exceptionWrapper) throws X {
        Objects.requireNonNull(listPredicate);
        Objects.requireNonNull(listFunction);
        Objects.requireNonNull(exceptionWrapper);
        try {
            return Collectors.collectingAndThen(Collectors.toList(), list -> {
                if (!listPredicate.test(list)) {
                    throw new IllegalStateException(); //Line that throws the exception
                }
                return listFunction.apply(list);
            });
        } catch (IllegalStateException ex) {
            throw exceptionWrapper.apply(ex);
        }
    }

    public static <E> Collector<E, ?, E> singleElementCollector() throws NotASingleElementException {
        return listAndThenCollector(list -> list.size() == 1, list -> list.get(0), NotASingleElementException::new);
    }
}

IllegalStateException被拋出:line throw new IllegalStateException()

用法示例:

public static void test() {
    try {
        Integer result = IntStream.range(0, 2)
                .boxed()
                .collect(CollectorUtils.singleElementCollector());
    } catch (NotASingleElementException ex) {
        Logger.getLogger(CollectorUtils.class.getName()).log(Level.SEVERE, null, ex);
    }
}

這段代碼應拋出NotASingleElementException ,而不是拋出IllegalStateException ,我怎么能讓它工作?

做一個實際的工作時錯誤的行為:

Exception in thread "pool-3-thread-1" java.lang.IllegalStateException
    at dpc2.base.utils.CollectorUtils.lambda$listAndThenCollector$0(CollectorUtils.java:28)
    at dpc2.base.utils.CollectorUtils$$Lambda$21/2071035411.apply(Unknown Source)
    at java.util.function.Function.lambda$andThen$6(Function.java:88)
    at java.util.function.Function$$Lambda$22/63121782.apply(Unknown Source)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:503)
    at dpc2.base.utils.ImageMagickUtils.convertPDFToTIFF(ImageMagickUtils.java:30)
    at dpc2.server.convert.ConvertConsumer.accept(ConvertConsumer.java:20)
    at dpc2.server.convert.ConvertConsumer.accept(ConvertConsumer.java:14)
    at dpc2.base.checker.BaseChecker.lambda$null$0(BaseChecker.java:116)
    at dpc2.base.checker.BaseChecker$$Lambda$15/2121862243.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:744)

您的收集器已返回但未在listAndThenCollector方法中收集。 實際的收集發生在:

.collect(CollectorUtils.singleElementCollector());

這是你的測試方法。 那是拋出異常的時候。

我會說這是因為當你調用Collectors.collectingAndThen你傳遞一個當時沒有執行的lambda。 當它最終執行時,你的捕獲不再是捕獲它。

你不能用:

//throw new IllegalStateException();
throw exceptionWrapper.apply(new IllegalStateException());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM