W poniższym kodzie, gdy wzrok NumberFormatException
Spośród for
iteracji, struny w odpowiedniej formie zamieszczonej w strList
przed pierwszym złego (tj "illegal_3"
) zostały pomyślnie przeanalizowane (tj. "1"
i "2"
zostały przeanalizowane jako liczby całkowite 1
i 2
).Catching wyjątki od „strumienia()” lub 'parallelStream() traci poprawne wartości
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);
}
Jednak przy wymianie for
iteracji przez stream()
lub parallelStream()
, tracę 1
i 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);
}
Jaka jest specyfikacja przepływu sterowania wyjątków rzucanych od wewnątrz
stream()
lubparallelStream()
?Jak mogę uzyskać wynik
intList = [1,2]
(czyli ignorować te po pierwszymNumberFormatException
jest wyrzucany) lub nawet lepiejintList = [1,2,4,6]
(czyli ignorowanie złych zNumberFormatException
) zstream()
lubparallelStream()
po prostu myślał o tych samych rzeczach wczoraj. +1 na dobre pytanie – Andremoniy
Istnieje wiele powiązanych pytań (zbyt wiele, aby je tutaj wymienić, a niektóre z nich mogą (przynajmniej prawie) być duplikatami). Skrócona forma: specyfikacja przepływu kontrolnego jest zawsze taka sama, niezależnie od tego, czy używasz strumieni, czy nie. Jeśli nie chcesz, aby wyjątki wypłynęły i przerwały przepływ kontrolny, będziesz musiał je złapać lokalnie. BTW: Zauważ, że nawet ** jeśli ** pracowałeś wokół samego wyjątku: IIRC, wynik z 'parallelStream' może nadal być' [2,1] '.... – Marco13