Dereference … may produce 'java.lang.NullPointerException'

356
06 сентября 2017, 12:56

Есть следующий код:

TerminalsTypes terminalType = TerminalsTypes.valueOf(terminalTypeId) != null
                ? TerminalsTypes.valueOf(terminalTypeId)
                : TerminalsTypes.SPR;
switch (terminalType) {
    ...
}

И при этом Intellij Idea подсвечивает terminalType внутри switch и при наведении мышки выдаёт следующее сообщение:

Dereference of 'terminalType' may produce 'java.lang.NullPointerException'

Почему это сообщение выводится несмотря на то, что при инициализации terminalType очевидно, что его значение быть null не может?

UPD

Код метода TerminalsTypes.valueOf:

public enum TerminalsTypes {
   ...
   public static TerminalsTypes valueOf(int type) {
        switch (type) {
            case 0:
                return SPR;
            ...
            default:
                return null;
        }
    }
   ...
}
Answer 1

Среда действует довольно логично: TerminalsTypes.valueOf(terminalTypeId) может вернуть null.

В коде есть две ветки, в одной из которых TerminalsTypes.valueOf(terminalTypeId), которая может вернуть null, поэтому логичное предупреждение, что при использовании результата может быть исключение.

Решением может быть сохранение результата вызова TerminalsTypes.valueOf(terminalTypeId) в локальную переменную, которая уже будет использоваться в проверке:

TerminalsTypes terminalTypeValue = TerminalsTypes.valueOf(terminalTypeId)
TerminalsTypes terminalType = terminalTypeValue != null
                ? terminalTypeValue
                : TerminalsTypes.SPR;
switch (terminalType) {
    ...
}
Answer 2

Совершенно не очевидно. Например такой вариант

class TerminalsTypes {
    public static TerminalsTypes valueOf(int terminalTypeId) {
        return Math.random() > 0.5 ? new TerminalsTypes() : null;
    }
}

Будет выдавать разное при разных вызовах

Чтобы избежать этого можно добавить такой код

TerminalsTypes terminalType = TerminalsTypes.valueOf(terminalTypeId);
if(terminalType == null) {
    terminalType = TerminalsTypes.SPR;
}

Или такой

TerminalsTypes terminalType = TerminalsTypes.valueOf(terminalTypeId);
terminalType = terminalType == null ? TerminalsTypes.SPR : terminalType;
READ ALSO
Работа с Google Maps API Android

Работа с Google Maps API Android

Подскажите пожалуйста есть ли способ используя Google Maps API под Android отображать только конкретную страну/город вместо всей карты?

353
Начертания шрифта

Начертания шрифта

Есть шрифт Tahoma:

357
Достать значение из тэга. Парсинг html

Достать значение из тэга. Парсинг html

Использую библиотеку JSOUPВот кусок HTML, который я парсю:

359
Как зафиксировать текст

Как зафиксировать текст

Как зафиксировать текст, что бы при разных разрешениях он не делился пополам, а переносился полностью?

279