Im folgenden Code, wenn NumberFormatException
aus for
Iteration fangen die Strings in geeigneter Form in strList
vor der ersten schlechten (dh "illegal_3"
) wurden erfolgreich geparst (dh "1"
und "2"
wurden als Ganzzahlen geparst 1
und 2
).Abfangen von Ausnahmen aus 'stream()' oder 'parallelStream()' verliert die korrekten Werte
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);
}
Wenn jedoch for
Iteration durch stream()
oder parallelStream()
ersetzen, verliere ich 1
und 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);
}
Was ist die Spezifikation des Steuerflusses von geworfenen Ausnahmen innerhalb
stream()
oderparallelStream()
?Wie kann ich das Ergebnis von
intList = [1,2]
(dh ignorieren die, die nach dem erstenNumberFormatException
geworfen wird) oder sogar besserintList = [1,2,4,6]
(dh ignorieren die schlechten mitNumberFormatException
) mitstream()
oderparallelStream()
Ich dachte gerade an gleichen Dinge gestern. +1 für eine gute Frage – Andremoniy
Es gibt viele verwandte Fragen (zu viele, um sie hier aufzulisten, und einige von ihnen könnten (zumindest fast) Duplikate sein). Die Kurzform: Die Kontrollflussspezifikation ist immer gleich, unabhängig davon, ob Sie Streams verwenden oder nicht. Wenn Sie nicht möchten, dass die Ausnahmen platzen und den Kontrollfluss unterbrechen, müssen Sie sie lokal abfangen. BTW: Beachten Sie, dass sogar ** wenn ** Sie um die Ausnahme selbst gearbeitet haben: IIRC, das Ergebnis mit einem 'parallelStream' könnte immer noch '[2,1]' .... – Marco13