Java 可选orElse意外抛出NPE;将null作为值

Java 可选orElse意外抛出NPE;将null作为值,java,java-8,optional,Java,Java 8,Optional,功能: 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(arr

功能:

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]+"  ");
    }
}
NPE被抛出。为什么Optional.orElse函数不创建新的整数对象?我检查了StackOverflow,但没有发现orElse的NPE被抛出。我发现这种行为出乎意料

欢迎所有建议。

您应该传递Optional.empty而不是null:

如果传递null,它将使用NPE失败,因为在null对象上调用orElse在Java中没有特殊处理,它只是一个普通对象

注意:使用Optionant而不是Optional

您应该传递Optional.empty而不是null:

如果传递null,它将使用NPE失败,因为在null对象上调用orElse在Java中没有特殊处理,它只是一个普通对象

注意:使用Optionant而不是Optional

首先,您不应该将Optionals作为参数传递到方法中,如果您看到将Optionals传递到方法中的代码,请更改它,在调用方法的地方展开Optionals。 考虑一下,

PS:只是为了好玩:我的建议是,如果你在这里使用optionals,那么为什么不使用streams呢

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 + " "));
}
首先,您不应该将Optionals作为参数传递到方法中,如果您看到将Optionals传递到方法中的代码,请更改它,在调用方法的地方展开Optionals。 考虑一下,

PS:只是为了好玩:我的建议是,如果你在这里使用optionals,那么为什么不使用streams呢

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 + " "));
}


我不完全确定,但我认为使用opriol作为方法参数或方法返回是一种不好的做法。我不太明白为什么人们甚至在简单的任务中也倾向于使用lambda表达式。通常情况下,它会降低代码的可读性和调试难度,如这里所示。为什么不定义基元int而不是可为null的整数?@Zorglube实际上是可选的,主要用作方法参数和返回值。如果没有,还有什么地方可以使用它?@jediz问题中的lambda表达式在哪里?@Zorglube:是的,将optional作为方法参数传递很难看。flatMap使它变得不必要。我不完全确定,但我认为使用Oprional作为方法参数或方法返回是一种不好的做法。我不太明白为什么人们倾向于使用lambda表达式,即使是在简单的任务中。通常情况下,它会降低代码的可读性和调试难度,如这里所示。为什么不定义基元int而不是可为null的整数?@Zorglube实际上是可选的,主要用作方法参数和返回值。如果没有,还有什么地方可以使用它?@jediz问题中的lambda表达式在哪里?@Zorglube:是的,将optional作为方法参数传递很难看。flatMap使它变得不必要。我已经尝试过这个,它也可以工作,但这是非常复杂的。感谢您的回答。这就是为什么您应该避免将选项作为参数传递给方法的原因。。。。。。。。或者为什么应该避免将null传递给方法。。。。。因为如果你这样做,你就违背了期权的全部目的。接吻原则。我试过这个,它也很有效,但这很复杂。感谢您的回答。这就是为什么您应该避免将选项作为参数传递给方法的原因。。。。。。。。或者为什么应该避免将null传递给方法。。。。。因为如果你这样做,你就违背了期权的全部目的。亲吻原则。@NathanHughes“OP”是什么意思?@Pavel这根本不值得回答。请删除它。在前面的回答中已经指出了Optionant。另外,不要仅仅为了好玩而写答案。请转到专门针对它的社交平台。@StutiVerma你看。。。在java中,将选项作为参数传递给方法-是代码气味的标志。。。一个这样写的人的标志——不知道如何使用选项。所以我必须指出,无论你喜欢与否。我见过很多这样的代码,是我亲爱的来自阳光灿烂的印度的同事们写的…@NathanHughes“OP”是什么意思?@Pavel这根本不值得回答。请删除它。在前面的回答中已经指出了Optionant。另外,不要仅仅为了好玩而写答案。请转到专门针对它的社交平台。@StutiVerma你看。。。在java中,将选项作为参数传递给方法-是代码气味的标志。。。一个这样写的人的标志——不知道如何使用选项。所以我必须指出,无论你喜欢与否。我见过很多这样的代码,它们是由我亲爱的来自阳光灿烂的印度的同事编写的。。。
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] + "  ");
    }
}
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