Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么会抛出空指针异常?_Java_Nullpointerexception - Fatal编程技术网

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():"")