Условный оператор в конкатенированной строке
Я хотел бы знать, почему следующая программа выбрасывает 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;
}