Необязательный orElse неожиданно выбрасывает NPE;принимая ноль в качестве значения - PullRequest
0 голосов
/ 22 ноября 2018

Функция:

private static void printArray(int[] array, Optional<Integer> startIndex, Optional<Integer> endIndex) {
    for(Integer i = a.orElse(new Integer(0)); i<=endIndex.orElse(new Integer(array.length));i++) {
        System.out.print(array[i]+"  ");
    }
}

При передаче значения, такого как:

printArray(arr1, null, null);

Бросается NPE .Почему функция Optional.orElse не создает новый объект Integer?Я проверил StackOverflow, но не смог найти NPE из orElse, который был брошен.Я считаю это поведение неожиданным.

Все предложения приветствуются.

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018
private static void printArray(int[] array, Optional<Integer> startIndex, Optional<Integer> endIndex) {
    int from = Optional.ofNullable(startIndex).orElse(Optional.of(0)).orElse(0);
    int to = Optional.ofNullable(endIndex).orElse(Optional.of(array.length)).orElse(array.length);

    for (int i = from; i <= to; i++) {
        System.out.print(array[i] + "  ");
    }
}
0 голосов
/ 26 ноября 2018

Прежде всего вы не должны передавать Optionals в качестве параметров в метод , если вы видите код, который передает опциональные значения в методы - измените его, разверните опционные опции в том месте, где вы вызываете метод.Рассмотрим этот шпаргалку от Zeroturnaround .

PS: Просто для удовольствия: я предлагаю, если вы используете дополнительные функции здесь, так почему бы не использовать потоки?:)

public static void main(String[] args) {
    int[] array = new int[]{1, 2, 3, 4, 5};

    printArray(array, OptionalInt.of(0), OptionalInt.empty());
    System.out.println();
    printArray(array, OptionalInt.of(1), OptionalInt.empty());
    System.out.println();
    printArray(array, OptionalInt.of(1), OptionalInt.of(2));
    System.out.println();

}

private static void printArray(int[] array, OptionalInt startIndex, OptionalInt endIndex) {
    int startIdx = startIndex.orElse(0);
    int endIdx = endIndex.orElse(array.length);

    if (endIdx < startIdx)
        return;

    Arrays.stream(array).skip(startIdx).limit(endIdx).forEach(n -> System.out.print(n + " "));
}

Это дает нам такой вывод:

1 2 3 4 5 
2 3 4 5 
2 3 
0 голосов
/ 22 ноября 2018

Вы должны передать Optional.empty() вместо null:

printArray(arr1, Optional.empty(), Optional.empty());

Если вы передадите null, он потерпит неудачу с NPE, потому что вы вызываете orElse для объекта null (Необязательно)не имеет специальной обработки в Java, это просто обычный объект).

PS Используйте OptionalInt вместо Optional<Integer>

...