我想知道为什么以下程序会抛出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());
}
没有。这当然是一个优先考虑的问题,我很好奇连接是如何工作的。
答案 0 :(得分:19)
这是理解operator precedence的重要性的一个例子。
您需要括号,否则会被解释如下:
String test = ("test" + testInteger) == null ? "(null)" : testInteger.toString();
有关运算符及其优先级的列表,请参阅here。另请注意该页面顶部的警告:
注意:如果有可能混淆,请使用明确的括号。
答案 1 :(得分:6)
没有括号,它有效地做到了这一点:
String test = ("test" + testInteger) == null ? "(null)" : testInteger.toString();
这导致了NPE。
答案 2 :(得分:0)
我相信你需要添加括号。这是一个生成“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;
}