为什么抛出空指针异常?

时间:2013-12-12 15:57:42

标签: java nullpointerexception

我已经在这里问了一个矛盾问题 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 中尝试其他字符串连接时,为什么它不起作用?

3 个答案:

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

如果我错了,请纠正我。