Null и NullPointerexception в потоке Java

Вот мой пример:

import java.util.ArrayList;
import java.util.stream.IntStream;


public class Example {

     public static void main( String[] args )  {

         ArrayList<Integer> list = new ArrayList<>();
         list.add(0);list.add(1);list.add(2);

         SomeObject  a = IntStream.range(0,list.size())
                  .filter(i->list.get(i)==3 || list.get(i)==4)
                  .mapToObj(i->new SomeObject(i,list.get(i)))
                  .findFirst()
                  .orElse(null);
         System.out.println(a);
   }
}

class SomeObject{
    int index;
    int value;
    SomeObject(int index,int value){
            this.index=index;
            this.value=value;
    }

    @Override
    public String toString() {
        return this.index+" "+this.value;
    }
}

Почему, когда мы вызываем System.out.println(a);, мы не получаем NullPointerException?

Поскольку orElse (null) возвращает объект, указывающий на null. Если нет, то в чем разница между нулем в методе orElse и объектом, указывающим на нуль?

System.out.println может распечатать ссылку на null.
Eran 22.11.2018 12:49

почему это не относится к необязательному указанию на null. из-за этого я был сбит с толку. если я поставил .get (); вместо orElse (null) я получу исключение.

xmen-5 22.11.2018 12:53

ради этого SomeObject b =null; System.out.println(b); тоже не бросит NPE. Твердо верю, что это дубликат. Голосование закрыть как дублирующее. В связанном вопросе есть ответ, в котором указано, что вызывает NPE.

Naman 22.11.2018 14:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
169
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поехали немного подробнее ...

System.out.println(a); называет эту перегрузку println:

public void println(Object x)

в котором говорится:

Prints an Object and then terminate the line. This method calls at first String.valueOf(x) to get the printed object's string value, then behaves as though it invokes print(String) and then println().

Учитывая вышеизложенное, перейдем к методу String.valueOf:

public static String valueOf(Object obj)

в котором говорится:

Returns: if the argument is null, then a string equal to "null"; otherwise, the value of obj.toString() is returned.

Поскольку obj - это нулевой, возвращается "ноль" и obj.toString() никогда не вызывается, следовательно, нет исключения.


Что касается вашего следующего комментария:

why it is not the case for an optional pointing to null. for that i was confused.if i put .get(); in place of orElse(null), i will get an exception.

Optional<T> не «указывает на нуль» (используется неправильная терминология, обычно мы говорим, что параметр Optional либо имеет состояние настоящее время, либо состояние отсутствует).

Следует избегать небрежного вызова .get() из Optional<T>, если только вы не уверены, что Optional<T> не пустой.

В этом случае вы получаете NoSuchElementException просто потому, что в нем нет значения, и это задокументировано в API Optional<T>.

why it is not the case for an optional pointing to null.

Чтобы ответить на этот комментарий, поскольку я думаю, что это то, что вы пытаетесь задать в вопросе, см. Этот отвечать.

Необязательный, представленный в Java 8, представляет собой объект-контейнер, который используется для содержат, в частности, ненулевые объекты.. Вместо этого необязательный объект используется для представления null с отсутствующим значением.

Тот факт, что метод findFirst () возвращает Optional, является спорным дизайнерским решением. Но так оно и есть сейчас.

Другие вопросы по теме