||的功能 操作者

Tai*_*iga 3 java logic operators

我创建了一个equals方法.我相信我可以用两种方式做到,但java似乎并不同意.这是我知道的第一个例子.

    public class HelloWorld {

     public boolean equals(Object rhs){
        if(this==rhs){
            return true;
        }else if( rhs==null || this.getClass() != rhs.getClass()){
            return false;
        }else{

            HelloWorld tmp =(HelloWorld)rhs;
            return true;
        }
     }

     public static void main(String[] args){
        HelloWorld c = new HelloWorld();
        System.out.println(c.equals(null));

     }  
}
Run Code Online (Sandbox Code Playgroud)

这是第二个不起作用的例子.而不是返回false我得到nullpointerexception.

    public class HelloWorld {

     public boolean equals(Object rhs){
        if(this==rhs){
            return true;
        }else if(this.getClass() != rhs.getClass() || rhs==null){
            return false;
        }else{

            HelloWorld tmp =(HelloWorld)rhs;
            return true;
        }
     }

     public static void main(String[] args){
        HelloWorld c = new HelloWorld();
        System.out.println(c.equals(null));

     }  
}
Run Code Online (Sandbox Code Playgroud)

我的问题是......两段代码之间的唯一区别在于我写的第一篇文章

    rhs ==null ||...
Run Code Online (Sandbox Code Playgroud)

在第二部分中,它位于OR运算符的另一侧

    ...|| rhs==null
Run Code Online (Sandbox Code Playgroud)

为什么第一种情况不会给我一个Nullpointer但第二种情况呢?为什么要在OR运算符的哪一边写入布尔语句?

rge*_*man 6

这很重要,因为||作为条件"OR"运算符,如果左表达式是true,则不会评估正确的表达式,因为结果已经可以确定.这被称为"短路"行为.

JLS第15.24节涵盖了这一点:

条件或运算符|| 运算符就像| (§15.22.2),但仅当其左侧操作数的值为false时才计算其右侧操作数.

右手表达式未被评估,因此NullPointerException避免了.

(&&条件"AND"运算符,也是"短路",如果左侧是,则仅评估右侧true.)