Условный оператор в конкатенированной строке

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

public static void main(String[] args) {
    Integer testInteger = null;
    String test = "test" + testInteger == null ? "(null)" : testInteger.toString();
}

пока этот

public static void main(String[] args) {
    Integer testInteger = null;
    String test = "test" + (testInteger == null ? "(null)" : testInteger.toString());
}

нет. Это, безусловно, приоритетная проблема, и мне любопытно, как работает конкатенация.

Ответ 1

Это пример важности понимания приоритета оператора.

Вам нужны скобки, иначе они интерпретируются следующим образом:

String test = ("test" + testInteger) == null ? "(null)" : testInteger.toString();

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

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

Ответ 2

Без скобок это делает это эффективно: String test = ("test" + testInteger) == null ? "(null)" : testInteger.toString(); Это приводит к NPE.

Ответ 3

Поскольку он оценивается как "test" + testInteger (который является "testnull" и, следовательно, NOT NOT), это означает, что ваш тест testInteger == null никогда не вернет true.

Ответ 4

Я считаю, что вам нужно добавить скобки. Вот рабочий пример, который создает " http://localhost:8080/catalog/rest"

public static String getServiceBaseURL(String protocol, int port, String hostUrl, String baseUrl) {
    return protocol + "://" + hostUrl + ((port == 80 || port == 443) ? "" : ":" + port) + baseUrl;
}