包装方法抛出异常时出现编译错误

在 JDK 11 和 12 中,包装为在流中抛出运行时异常的已检查异常失败并出现编译错误。


package com.mmk.test;


import java.net.URL;

import java.util.ArrayList;

import java.util.function.Function;


public class App {

    public static void main(String[] args) {

        var list = new ArrayList<String>();

        list.add("http://foo.com");

        list.stream().map(wrap(url -> new URL(url)));

    }


    static <T, R, E extends Throwable> Function<T, R>

    wrap(FunException<T, R, E> fn) {

        return t -> {

            try {

            return fn.apply(t);

            } catch (Throwable throwable) {

                throw new RuntimeException(throwable);

            }

        };

    }


    interface FunException<T, R, E extends Throwable> {

        R apply(T t);

    }

}

预期:没有编译错误,也没有输出。实际:编译错误,未处理的异常。


幕布斯7119047
浏览 99回答 1
1回答

慕尼黑的夜晚无繁华

该FunException::apply方法没有声明任何要抛出的异常,因此当您创建一个可以抛出异常的 lambda 时url&nbsp;->&nbsp;new&nbsp;URL(url)编译器会抱怨,因为你没有处理这个异常,也FunException::apply没有在它的throws子句中声明它。您可以通过添加一个子句使其工作throws,即:interface&nbsp;FunException<T,&nbsp;R,&nbsp;E&nbsp;extends&nbsp;Throwable>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;apply(T&nbsp;t)&nbsp;throws&nbsp;E; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java