Nel codice seguente, quando cattura NumberFormatException
fuori for
iterazione, le stringhe in forma adeguata che appaiono nelle strList
prima che il primo cattivo (vale a dire, "illegal_3"
) sono stati analizzati correttamente (ovvero, "1"
e "2"
sono stati analizzati come numeri interi 1
e 2
).Catching eccezioni su 'flusso()' o 'parallelStream()' perde valori corretti
public void testCaughtRuntimeExceptionOutOfIteration() {
List<String> strList = Stream.of("1", "2", "illegal_3", "4", "illegal_5", "6").collect(Collectors.toList());
List<Integer> intList = new ArrayList<>();
try{
for (String str : strList) {
intList.add(Integer.parseInt(str));
}
} catch (NumberFormatException nfe) {
System.err.println(nfe.getMessage());
}
List<Integer> expectedIntList = Stream.of(1, 2).collect(Collectors.toList());
// passed
assertEquals("The first two elements have been parsed successfully.", expectedIntList, intList);
}
Tuttavia, quando si sostituisce for
iterazione stream()
o parallelStream()
, perdo 1
e 2
.
public void testCaughtRuntimeExceptionOutOfStream() {
List<String> strList = Stream.of("1", "2", "illegal_3", "4", "illegal_5", "6").collect(Collectors.toList());
List<Integer> intList = new ArrayList<>();
try{
intList = strList.stream() // same with "parallelStream()"
.map(Integer::parseInt)
.collect(Collectors.toList());
} catch (NumberFormatException nfe) {
System.err.println(nfe.getMessage());
}
List<Integer> expectedIntList = Stream.of(1, 2).collect(Collectors.toList());
// failed: expected:<[1,2]>, but was:<[]>
assertEquals("The first two elements have been parsed successfully.", expectedIntList, intList);
}
Qual è la specificazione del flusso di controllo di eccezioni sollevate da dentro o
stream()
parallelStream()
?Come posso ottenere il risultato di
intList = [1,2]
(vale a dire, ignorate quelle dopo la primaNumberFormatException
è torta) o meglio ancoraintList = [1,2,4,6]
(vale a dire, ignorare i cattivi conNumberFormatException
) constream()
oparallelStream()
Ho appena stato a pensare stesse cose di ieri. +1 per una buona domanda – Andremoniy
Ci sono molte domande correlate (troppe per elencarle qui e alcune potrebbero essere (almeno quasi) duplicate). La forma abbreviata: la specifica del flusso di controllo è sempre la stessa, indipendentemente dal fatto che stiate utilizzando o meno flussi. Se non vuoi che le eccezioni esplodano e interrompa il flusso di controllo, dovrai catturarle localmente. BTW: Nota che anche ** se ** hai lavorato attorno all'eccezione stessa: IIRC, il risultato con un 'parallelStream' potrebbe essere ancora' [2,1] '.... – Marco13