Java 8 Предварительные условия Guava, генерирующие исключение NullPointerException при оценке строки сообщения об исключении - PullRequest
3 голосов
/ 17 марта 2020

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

Preconditions.checkArgument(Objects.isNull(myObject),
                        "This object is not null #%s.", myObject.getId());

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

Предварительные условия guava оценивают Строка сообщения об исключении независимо от того, является ли условие истинным или нет?

Ответы [ 2 ]

5 голосов
/ 17 марта 2020

С

Preconditions.checkArgument(Objects.isNull(myObject),
                    "This object is not null #%s.", myObject.getId());

вы должны посмотреть, что происходит в каком порядке:

Перед тем, как произойдет любой вызов checkArgument(), все аргументы к нему будут оценены:

  • Objects.isNull(myObject)
  • строка
  • myObject.getId()

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

Просто для полноты, как это уже упоминалось в другом месте: путь к go будет myObject == null ? null: myObject.getId(), поскольку он позволяет избежать разыменования в случае null объект.

2 голосов
/ 17 марта 2020

Вы можете взломать его с помощью (например):

static void test(Object myObject) {

    Preconditions.checkArgument(
        myObject == null, "This object is not null #%s.", myObject == null ? null : myObject.getId()
    );

}

Условие: myObject == null ? myObject : myObject.hashCode() все еще будет оцениваться, всегда; но само сообщение об ошибке не будет вычислено, пока не потребуется.

...