连接字符串中的条件运算符

时间:2012-07-27 10:56:22

标签: java

我想知道为什么以下程序会抛出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());
}

没有。这当然是一个优先考虑的问题,我很好奇连接是如何工作的。

3 个答案:

答案 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;
}