我已经在这里问了一个矛盾问题 Why is this not throwing a NullPointerException?
但这是我想知道的不同类型和行为之一,请查看下面的示例
package com;
public class test {
public static void main(String[] args) {
Abc abc = null;
//Scenario 1
System.out.println("ERROR HERE " + abc!=null?abc.getS1():""); //This is throwing null pointer exception
//Scenario 2
String s1 = abc!=null?abc.getS1():"";
System.out.println("This is fine " + s1);
}
}
class Abc {
String s1;
public String getS1() {
return s1;
}
public void setS1(String s1) {
this.s1 = s1;
}
}
所以这里场景2 会正常工作,但是当我在场景1 中尝试其他字符串连接时,为什么它不起作用?
答案 0 :(得分:5)
"ERROR HERE " + abc!=null?abc.getS1():""
相当于
("ERROR HERE " + abc!=null)?abc.getS1():""
(从不评估为假,因此你获得NPE)
你的意思是:
"ERROR HERE " + (abc!=null?abc.getS1():"")
答案 1 :(得分:2)
您需要将它(带括号)分开,以便将其作为一个完整的单独语句读取
System.out.println("ERROR HERE " + (abc != null ? abc.getS1() : ""));
答案 2 :(得分:0)
为Eyal和Ross投票+1票。
在看到Tenner的回答和评论后,我得出结论,
它正在抛出nullPointerException
,因为!= 运算符优先级低于 + 。
所以编译器调用 abc 类的toString
方法,因此 abc null 它正在抛出nullPointerException
如果我错了,请纠正我。