Обработка исключений Java Lambda

У меня проблема с обработкой исключений без использования try and catch в лямбдах.

Я нашел пример кода, для которого мне нужно создать собственный интерфейс Consumer, но он не работает, и я не знаю, как его исправить.

import java.util.function.Consumer;

@FunctionalInterface
public interface ThrowingConsumer<T, E extends Exception> {
    void accept(T t) throws E;

    static <T> Consumer<T> throwingConsumerWrapper(
            ThrowingConsumer<T, Exception> throwingConsumer) {

        return i -> {
            try {
                throwingConsumer.accept(i);
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        };
    }
}

Вот лямбда, в которой мне нужно обрабатывать IOException. Это исключение должно быть выброшено из main. Я не хочу использовать пробные версии в main.

public static void main(String[] args) throws IOException {
    Function<String, List<String>> flines = fileName -> {
        Scanner scanner;
        ArrayList<String> wiersze = new ArrayList<>();
        File f = new File(fileName);

        scanner = new Scanner(f); // here :(

        while (scanner.hasNext()) {
            wiersze.add(scanner.nextLine());
        }

        scanner.close();

        return wiersze;
    };
}

Я новичок в Java, поэтому не могли бы вы объяснить мне, как решить эту проблему самым простым способом.

Вы не можете обработать исключение без его обработки catch.

Michael Butscher 18.11.2018 01:40

почему нельзя использовать try и catch?

Jere 18.11.2018 02:01

Мой профессор сказал, что я должен сделать это по-другому: /

Lolek Parabolek 18.11.2018 15:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
150
1

Ответы 1

Итак, ваша проблема в том, что у вас есть фрагмент кода, который генерирует проверенное исключение, и вы хотите, чтобы он стал реализацией объекта Function? Вы где-то нашли, как это сделать для Consumer, вам просто нужен адаптер кода для Function?

Предполагая, что перезапись должна выглядеть примерно так:

import java.util.function.Function;

@FunctionalInterface
public interface ThrowingFunction<T, R, EXC extends Exception> {
    R apply(T t) throws EXC;

    static <T> Function<T> throwingFunctionWrapper(
       ThrowingFunction<T, R, Exception> throwingFunction
    ) {
        return t -> {
            try {
                return throwingFunction.apply(t);
            } catch (Exception exc) {
                throw new RuntimeException(exc);
            }
        };
    }
}

В более общем смысле throwingFunctionWrapper может быть:

static <T> Function<T> throwingFunctionWrapper(
   ThrowingFunction<T, R, ? extends Exception> throwingFunction
) {

Чтобы справиться с исключением, вы должны создать подкласс RuntimeException, а затем перехватить только этот класс, чтобы не разворачивать какие-либо другие исключения времени выполнения.

Разверните (с исходным кодом) как:

try {
   ...
} catch (RuntimeException exc) { // subclass me !!
   throw (IOException)exc.getCause();
}

Другие вопросы по теме