Supongamos que tengo una clase y un método
class A {
void foo() throws Exception() {
...
}
}
Ahora me gustaría llamar a foo para cada instancia de A
entregado por una secuencia como:
void bar() throws Exception {
Stream<A> as = ...
as.forEach(a -> a.foo());
}
Pregunta: ¿Cómo manejo adecuadamente la excepción? El código no se compila en mi máquina porque no manejo las posibles excepciones que puede generar foo (). El throws Exception
de bar
parece ser inútil aquí. ¿Porqué es eso?
java
java-8
unhandled-exception
java-stream
Bastian
fuente
fuente
Respuestas:
Debe ajustar su llamada al método en otra, donde no arroje excepciones marcadas . Todavía puedes lanzar cualquier cosa que sea una subclase de
RuntimeException
.Un lenguaje de envoltura normal es algo como:
(Supertype excepción
Exception
es solamente usado como ejemplo, nunca tratar de capturarlo por sí solo)A continuación, se le puede llamar con:
as.forEach(this::safeFoo)
.fuente
Si todo lo que desea es invocar
foo
, y prefiere propagar la excepción tal como está (sin envolver), también puede usar elfor
bucle de Java en su lugar (después de convertir el Stream en un Iterable con algunos trucos ):Esto es, al menos, lo que hago en mis pruebas JUnit, donde no quiero pasar por el problema de envolver mis excepciones marcadas (y de hecho prefiero que mis pruebas arrojen las originales sin envolver)
fuente
Esta pregunta puede ser un poco antigua, pero porque creo que la respuesta "correcta" aquí es solo una forma que puede conducir a algunos problemas Problemas ocultos más adelante en su código. Incluso si hay un poco de controversia , existen excepciones marcadas por alguna razón.
La forma más elegante, en mi opinión, puede encontrarla fue dada por Misha aquí . Agregue excepciones de tiempo de ejecución en las secuencias de Java 8 simplemente realizando las acciones en "futuros". Por lo tanto, puede ejecutar todas las partes de trabajo y recopilar Excepciones que no funcionan como una sola. De lo contrario, podría recopilarlos todos en una Lista y procesarlos más tarde.
Un enfoque similar proviene de Benji Weber . Sugiere crear un tipo propio para recopilar piezas de trabajo y no piezas de trabajo.
Dependiendo de lo que realmente desea lograr, se produjo una asignación simple entre los valores de entrada y los valores de salida. Las excepciones también pueden funcionar para usted.
Si no le gusta ninguna de estas formas, considere usar (según la excepción original) al menos una excepción propia.
fuente
stream.map(Streams.passException(x->mightThrowException(x))).catch(e->whatToDo(e)).collect(...)
. Debe esperar excepciones y le permite manejarlas como lo hacen los futuros.Sugiero usar la clase Google Guava Throwables
ACTUALIZAR:
Ahora que está en desuso, use:
fuente
Puede envolver y desenvolver excepciones de esta manera.
fuente
Es posible que desee hacer uno de los siguientes:
Varias bibliotecas le permiten hacer eso fácilmente. El siguiente ejemplo está escrito usando mi biblioteca NoException .
fuente
Forma más legible:
Solo escóndelo en un
RuntimeException
para pasarloforEach()
Aunque en este punto no me aguantaré contra alguien si dice omitir las transmisiones e ir con un bucle for, a menos que:
Collection.stream()
, es decir, no es una traducción directa a un bucle for.parallelstream()
fuente