Как бросить исключение в потребителя Java 8 - PullRequest
3 голосов
/ 10 марта 2020

Есть ли способ вызвать исключение при использовании потребителя в java 8?

Например:

    private void fooMethod(List<String> list) throws Exception {

    list.forEach(element->{
        if(element.equals("a")) {
            throw new Exception("error!");
        }
    });

}

Это дает мне ошибку компилятора, говорящую: Необработанный тип исключения Исключение

Как правильно в этом случае вызвать исключение?

Ответы [ 2 ]

4 голосов
/ 10 марта 2020

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

private void fooMethod(List<String> list) throws Exception {
    list.forEach(element->{
        if(element.equals("a")) {
            throw new RuntimException("error!");
        }
    });
}
1 голос
/ 11 марта 2020

Потоки и связанные классы не предназначены для использования проверенных исключений. Но любой RuntimeException может быть сгенерирован в любой точке кода, поэтому хитрость заключается в том, чтобы генерировать среду выполнения, причиной которой (цепочка исключений) является соответствующее проверенное исключение:

private void fooMethod(List<String> list) throws Exception {   
    list.forEach(element->{
        if(element.equals("a")) {
            throw new Runtime(new Exception("error!"));
        }
    });  
}

Затем в перехватывающем коде вы просто должны получить оригинальное проверенное исключение, инкапсулированное:

try {
    fooMethod(someList);
} catch(Throwable e) {
    Exception ex = e.getCause();
}
...