Ошибка компиляции при переносе метода с исключением - PullRequest
1 голос
/ 23 июня 2019

Проверенные исключения, упакованные для выброса исключения Runtime в потоках, завершаются ошибкой с ошибкой компиляции в 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);
    }
}

Ожидается: нет ошибки компиляции и нет выходных данных.Фактически: ошибка компиляции, необработанное исключение.

1 Ответ

2 голосов
/ 23 июня 2019

Метод FunException::apply не объявляет какие-либо исключения, поэтому при создании лямбды, которая может генерировать исключение

url -> new URL(url)

Компилятор жалуется, потому что вы не обрабатываете это исключение, и FunException::apply также не объявляет его в своем предложении throws.

Вы можете заставить его работать, добавив предложение throws, т.е.: * 10101

interface FunException<T, R, E extends Throwable> {
    R apply(T t) throws E;
}
...