Почему Stream.mapToInt не обрабатывает исключения NullPointerExceptions? - PullRequest
2 голосов
/ 09 июля 2020

Этот код выдаст исключение NullPointerException. Разве метод mapToInt (map) не должен обрабатывать NPE?

List<Integer> list = Arrays.asList(null, null);
OptionalDouble op = list.stream()
    .mapToInt(val->val)
    .average();

Ответы [ 2 ]

6 голосов
/ 09 июля 2020

Почему вы ожидаете, что он будет обрабатывать NullPointerException?

Лямбда-выражение val->val эквивалентно:

new ToIntFunction<Integer> () {
    int applyAsInt(Integer value) {
        return value;
    }
}

И когда метод, возвращающий int type возвращает Integer, происходит автоматическая распаковка. Это означает, что вызывается value.intValue(), и если value равно null, выбрасывается NullPointerException.

mapToInt() просто вызывает метод applyAsInt() экземпляра ToIntFunction, переданного ему для каждый элемент Stream.

У него нет причин проверять, является ли элемент null, и каким-либо образом обрабатывать его, поскольку он не может знать, как вы sh поступать с null с. Это работа экземпляра ToIntFunction, чтобы решить это, а ваш ToIntFunction не обрабатывает null с.

1 голос
/ 09 июля 2020

Как уже отмечал Эран в своем ответе , mapToInt не должен обрабатывать NPE.

Вместо этого вы должны справиться с этим, предоставив свой собственный null-check логи c. Например:

OptionalDouble op = list.stream()
                        .mapToInt(val -> val == null ? 0 : val)
                        .average();
...