Sneaky throw idiom ermöglicht das Umgehen von CheckedException
im Lambda-Ausdruck. Das Einwickeln einer CheckedException
in eine RuntimeException
ist nicht gut für eine strikte Fehlerbehandlung.
Es kann als eine Consumer
-Funktion in einer Java-Sammlung verwendet werden.
Hier ist eine einfache und verbesserte Version von jib's Antwort.
import static Throwing.rethrow;
@Test
public void testRethrow() {
thrown.expect(IOException.class);
thrown.expectMessage("i=3");
Arrays.asList(1, 2, 3).forEach(rethrow(e -> {
int i = e.intValue();
if (i == 3) {
throw new IOException("i=" + i);
}
}));
}
Dies wickelt das Lambda einfach in ein rethrow ein. Es sorgt dafür, dass CheckedException
jede Exception
neu auswirft, die in Ihrem Lambda geworfen wurde.
public final class Throwing {
private Throwing() {}
@Nonnull
public static Consumer rethrow(@Nonnull final ThrowingConsumer consumer) {
return consumer;
}
/**
* Der Compiler sieht die Signatur mit den geworfenen T als RuntimeException-Typ, sodass er die unbehandelte Ausnahme weiterleiten kann.
*
* http://www.baeldung.com/java-sneaky-throws
*/
@SuppressWarnings("unchecked")
@Nonnull
public static void sneakyThrow(@Nonnull Throwable ex) throws E {
throw (E) ex;
}
}
Finden Sie einen vollständigen Code und Unit-Tests hier.