14

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

没有。这当然是一个优先问题,我很好奇串联是如何在内部工作的。

4

4 回答 4

19

这是理解运算符优先级重要性的一个例子。

您需要括号,否则解释如下:

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

有关运算符及其优先级的列表,请参见此处。另请注意该页面顶部的警告:

注意:即使存在混淆的可能性,也要使用显式括号。

于 2012-07-27T10:58:25.870 回答
6

没有括号,它可以有效地做到这一点: String test = ("test" + testInteger) == null ? "(null)" : testInteger.toString(); 这会导致 NPE。

于 2012-07-27T10:58:55.563 回答
1

因为它被评估为"test" + testInteger(它是"testnull",因此不是 null),这意味着您的testInteger == null测试将永远不会返回 true。

于 2012-07-27T10:59:04.467 回答
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;
}
于 2017-10-16T06:22:18.643 回答