По-прежнему получаю исключение NullPointerException, даже если используется Optional <> - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь использовать Optional <> для проверки на nullpointexception и в случае, если это произойдет, а затем произойдет что-то еще для печати.(https://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html)

Я устанавливаю звуковую карту на ноль, и все еще получаю нулевое исключение, но я хочу избежать этого с дополнительным.

Основной класс (компьютер)

import java.util.Optional;

public class Computer {
    public Optional<SoundCard> getSoundcard() {
        return soundcard;
    }

    public void setSoundcard(Optional<SoundCard> soundcard) {
        this.soundcard = soundcard;
    }

    private Optional<SoundCard> soundcard = null ;


    public static void  main(String[] args)
    {
         Optional<Computer> computer = Optional.of(new Computer());;


        String verion = computer.flatMap(Computer::getSoundcard)
            .flatMap(SoundCard::getUsb)
            .map(USB::getVersion)
            .orElse("Unknown");
        System.out.println(verion);
    }
}

Другой класс SoundCard

import java.util.Optional;

public class SoundCard {

    public Optional<USB> getUsb() {
        return usb;
    }

    public void setUsb(Optional<USB> usb) {
        this.usb = usb;
    }

    private Optional<USB> usb = null;
}

Другой класс (USB)

public class USB {

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    private String version;
}

Любая подсказка илипомощь приветствуется:)

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Предполагая, что вы используете Java 8, вот javadoc класса Optional, вот что он говорит:

Контейнерный объект, который может содержать или не содержать ненулевое значение.Если значение присутствует, isPresent () вернет true, а get () вернет значение.

Теперь stream() - это то, что работает с набором объектов, а не с одним объектом. Вот документация для stream():

Возвращает последовательный поток с этой коллекцией в качестве источника.По сути, вам нужно иметь List<Computer> для вызова stream(), выполнить фильтрацию и вернуть Optional<Computer> по find методам.

Поскольку вы пытаетесь вызватьstream() для одного объекта, а не для коллекции, он отображает ошибку.

Кроме того, вызов любого метода для неинстанцированной переменной в java всегда приведет к ошибке компиляции, например:

Optional<Computer> computer ;
computer.stream(); // compilation error

Итак, нам нужно сначала инициализировать его и убедиться, что мы вызываем правильный метод в зависимости от типа ссылки.

0 голосов
/ 08 февраля 2019
// computer initialization
Optional<Computer> computer = Optional.of(new Computer());

// Applying operations to Optional<Computer>: stream() is for Collections, not for Optionals
String version = computer.flatMap(Computer::getSoundcard)
            .flatMap(SoundCard::getUsb)
            .map(USB::getVersion)
            .orElse("Unknown");

ОБНОВЛЕНО

Кроме того, поля типа Computer.soundcard (имеющие тип Optional) не следует инициализировать значением null, а использовать Optional.empty(), чтобы избежать NullPointerExceptionили похожие ошибки ...

Таким образом, полный код

public class Computer {
    public Optional<SoundCard> getSoundcard() {
        return soundcard;
    }

    public void setSoundcard(Optional<SoundCard> soundcard) {
        this.soundcard = soundcard;
    }

    private Optional<SoundCard> soundcard = Optional.empty() ;


    public static void  main(String[] args)
    {
        Optional<Computer> computer = Optional.of(new Computer());

        String version = computer
                .flatMap(Computer::getSoundcard)
                .flatMap(SoundCard::getUsb)
                .map(USB::getVersion)
                .orElse("Unknown");
        System.out.println(version);
    }
}

class SoundCard {

    public Optional<USB> getUsb() {
        return usb;
    }

    public void setUsb(Optional<USB> usb) {
        this.usb = usb;
    }

    private Optional<USB> usb = Optional.empty();
}

class USB {

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    private String version;
}
0 голосов
/ 08 февраля 2019

Вы должны инициализировать переменную компьютера:

Optional<Computer> computer = Optional.of(new Computer());

Как и вы, computer действительно не инициализировано.

...