У меня проблема с обработкой исключений без использования 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, поэтому не могли бы вы объяснить мне, как решить эту проблему самым простым способом.
почему нельзя использовать try и catch?
Мой профессор сказал, что я должен сделать это по-другому: /




Итак, ваша проблема в том, что у вас есть фрагмент кода, который генерирует проверенное исключение, и вы хотите, чтобы он стал реализацией объекта 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();
}
Вы не можете обработать исключение без его обработки
catch.