Java 为什么会抛出空指针异常?
我已经在这里提出了一个矛盾的问题 但这是我想知道的不同类型和行为之一,请看下面的例子Java 为什么会抛出空指针异常?,java,nullpointerexception,Java,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
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中尝试使用其他字符串连接时它不工作?您需要用括号将其分隔,以便将其作为一个完整的单独语句来阅读
System.out.println("ERROR HERE " + (abc != null ? abc.getS1() : ""));
相当于
("ERROR HERE " + abc!=null)?abc.getS1():""
它的计算结果永远不会为false,因此得到NPE
你的意思是:
"ERROR HERE " + (abc!=null?abc.getS1():"")
+1票支持艾尔和罗斯 在看到Tenner的回答和评论后,我得出结论 它正在引发nullPointerException,因为!=操作员优先级低于+ 所以编译器正在调用Abc类的toString方法,所以Abc为null,它正在抛出nullPointerException
如果我错了,请纠正我。由于第一种情况下println参数的求值顺序,这里的错误+abc首先求值并给出NPE。运算符优先级规则如下:“+”运算符在列表中比三元条件运算符“?:”高。
"ERROR HERE " + (abc!=null?abc.getS1():"")